Search code examples
javaswingjtabbedpanechangelistener

Java Swing - Knowing if tab has been removed/added in ChangeListener


Let's say I have JTabbedPane with a ChangeListener

JTabbedPane tabbedPane = new JTabbedPane();

// Add few tabs
.....
.....

tabbedPane.addChangeListener(new ChangeListener() {
  public void stateChanged(ChangeEvent changeEvent) {
    // How to determine if the changeEvent was fired because of a tab remove/add ?
  }
});

and somewhere I am doing a

tabbedPane.removeTabAt(2);

and somewhere else

tabbedPane.add(panel, 0);

The ChangeListener should get fired now, is there any way to determine within the listener if it was called due to a tab remove/add ?

EDIT: I am basically trying to do some actions only when the user switches between tabs and not when adding or removing.


Solution

  • Depending on the exact requirement, you might keep track of the selected component and only do stuff if that has changed:

    ChangeListener l = new ChangeListener() {
    
        Component lastSelected = tabbedPane.getSelectedComponent();
        @Override
        public void stateChanged(ChangeEvent e) {
            if (lastSelected != tabbedPane.getSelectedComponent()) {
                LOG.info("changed: " + tabbedPane.getSelectedIndex());
                lastSelected = tabbedPane.getSelectedComponent();
            }
    
        }
    };
    tabbedPane.addChangeListener(l);
    

    Might not be good enough, though, as it will trigger if the selected tab itself is removed.