JTabbedPane ChangeListener

前端 未结 2 941
自闭症患者
自闭症患者 2020-12-30 19:03

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 tab

相关标签:
2条回答
  • 2020-12-30 19:35

    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?

    0 讨论(0)
  • 2020-12-30 19:51

    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)
    
    0 讨论(0)
提交回复
热议问题