java swing jtabbedpane changelistener

java - JTabbedPane ChangeListener



swing (2)

Necesito detectar cuándo cambia la pestaña seleccionada y obtener su índice.

El siguiente código funciona, pero dispara el println tantas veces como la cantidad de pestañas cargadas actualmente:

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 } });

¿Cuál es la forma correcta de hacer esto? Gracias de antemano.


Con JDK 6 Update 26 (Windows 7 64-Bit), solo obtengo un evento para el siguiente código de demostración:

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); }

¿Puedes averiguar en el depurador por qué el oyente se activa tres veces?


por ejemplo

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() { } }

imprimir

run: Selected paneNo : 1 Selected paneNo : 2 Selected paneNo : 3 BUILD SUCCESSFUL (total time: 7 seconds)