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)