Search code examples
javaswingchangelistener

ChangeListener not working as intended for JTabbedPane


I want to detect when a tab is changed and retrieve the selected index. All the examples I've been able to find seem outdated and I haven't been able to implement them successfully.

It forces me to cast my changeListener to javax.swing.event.ChangeListener, but at the same time doesn't let me compile that. Where am i going wrong?

ChangeListener changeListener = new ChangeListener() {
          public void stateChanged(ChangeEvent e) {
            JTabbedPane sourceTabbedPane = (JTabbedPane) e.getSource();
            int index = sourceTabbedPane.getSelectedIndex();
            System.out.println("Tab changed to: " + index);
          }

        @Override
        public void changed(ObservableValue arg0, Object arg1, Object arg2) {
            // TODO Auto-generated method stub

        }
        };
        tabbedPane.addChangeListener((javax.swing.event.ChangeListener) changeListener);

Solution

  • You're implementing the wrong ChangeListener when you invoke new ChangeListener. Check your imports. You should be implementing javax.swing.event.ChangeListener but it looks like you're actually implementing javafx.beans.value.ChangeListener.

    If you don't want to change your imports, the following would work too.

      javax.swing.event.ChangeListener changeListener = new javax.swing.event.ChangeListener() {
          @Override
          public void stateChanged(ChangeEvent e) {
            JTabbedPane sourceTabbedPane = (JTabbedPane) e.getSource();
            int index = sourceTabbedPane.getSelectedIndex();
            System.out.println("Tab changed to: " + index);
          }
        };
        tabbedPane.addChangeListener(changeListener);