Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JTabbedPane ChangeListener

I need to detect when the selected tab changes, and get its index.

The following code works, but it fires the println as many times as the amount of tabs currently loaded:

tabbedPane.addChangeListener(new ChangeListener() {     public void stateChanged(ChangeEvent e) {         System.out.println("Tab: " + tabbedPane.getSelectedIndex());         // Prints the string 3 times if there are 3 tabs etc     } }); 

What is the correct way of doing this?

like image 418
deprecated Avatar asked Jul 23 '11 10:07

deprecated


People also ask

What is the purpose of JTabbedPane?

The JTabbedPane class is used to switch between a group of components by clicking on a tab with a given title or icon. It inherits JComponent class.


2 Answers

By JDK 6 Update 26 (Windows 7 64-Bit), I only get one event for the following demonstration code:

public static void main(String[] args) {     JFrame frame = new JFrame();     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);     frame.setBounds(0, 0, 300, 400);     frame.setLayout(null);     final JTabbedPane tabbedPane = new JTabbedPane();     tabbedPane.addTab("One", new JPanel());     tabbedPane.addTab("Two", new JPanel());     tabbedPane.addTab("Three", new JPanel());     tabbedPane.addChangeListener(new ChangeListener() {         public void stateChanged(ChangeEvent e) {             System.out.println("Tab: " + tabbedPane.getSelectedIndex());         }     });     tabbedPane.setBounds(0, 0, 300, 400);     frame.add(tabbedPane);     frame.setVisible(true); } 

Can you figure out in the debugger why the listener is triggered three times?

like image 168
belgther Avatar answered Sep 28 '22 06:09

belgther


for example

import java.awt.*; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener;  public class TestTabbedPane {      public static void main(String[] args) {         Runnable r = new Runnable() {              @Override             public void run() {                 final JPanel ui = new JPanel(new BorderLayout(1, 1));                 JTabbedPane jtp = new JTabbedPane(JTabbedPane.LEFT);                 jtp.addTab("Apple", new JLabel("Apple"));                 jtp.addTab("Banana", new JLabel("Banana"));                 jtp.addTab("Cherries", new JLabel("Cherries"));                 jtp.addTab("Grapes", new JLabel("Grapes"));                 ui.add(jtp, BorderLayout.CENTER);                 jtp.setPreferredSize(new Dimension(200, 200));                 jtp.addChangeListener(new ChangeListener() {                      @Override                     public void stateChanged(ChangeEvent e) {                         if (e.getSource() instanceof JTabbedPane) {                             JTabbedPane pane = (JTabbedPane) e.getSource();                             System.out.println("Selected paneNo : " + pane.getSelectedIndex());                         }                     }                 });             }         };         SwingUtilities.invokeLater(r);     }      private TestTabbedPane() {     } } 

printOut

run: Selected paneNo : 1 Selected paneNo : 2 Selected paneNo : 3 BUILD SUCCESSFUL (total time: 7 seconds) 
like image 23
mKorbel Avatar answered Sep 28 '22 05:09

mKorbel