关闭标签后获取焦点标签

时间:2018-10-01 14:14:54

标签: java swing jtabbedpane

在JTabbedPane中,我将自定义数据对象与每个添加的选项卡相关联。选择选项卡时,我还有一个相应的Metadata对象,该对象显示在另一个面板中。我现在遇到的问题是,当关闭选项卡时,元数据面板会在刚刚关闭的选项卡中显示Data对象的元数据。理想情况下,我希望面板显示用户看到的“焦点对准”选项卡的元数据。但是,关闭标签页的行为意味着“选定的标签页”是被关闭的标签页,因此tabpane.getSelectedIndex()不起作用。关闭标签后如何获得焦点突出的标签?预先谢谢你!

1 个答案:

答案 0 :(得分:1)

细节中没有魔鬼,您没有提供。

我进行了快速测试,发现ChangeListenerContainerListener之前被调用,这确实很痛苦,但是,它始终报告正确的索引。

因此,您需要做的是将两者结合在一起,以便在调用它们时都会更新元数据窗格。

import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ContainerEvent;
import java.awt.event.ContainerListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JTabbedPane tabbedPane = new JTabbedPane();
                tabbedPane.addTab("One", new TabPane(tabbedPane));
                tabbedPane.addTab("Two", new TabPane(tabbedPane));
                tabbedPane.addTab("Three", new TabPane(tabbedPane));
                tabbedPane.addTab("Four", new TabPane(tabbedPane));

                tabbedPane.addContainerListener(new ContainerListener() {
                    @Override
                    public void componentAdded(ContainerEvent e) {
                    }

                    @Override
                    public void componentRemoved(ContainerEvent e) {
                        System.out.println("Removed " + e.getChild());

                    }
                });

                tabbedPane.addChangeListener(new ChangeListener() {
                    @Override
                    public void stateChanged(ChangeEvent e) {
                        System.out.println(tabbedPane.getSelectedIndex());
                    }
                });

                JFrame frame = new JFrame();
                frame.add(tabbedPane);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TabPane extends JPanel {
        private JTabbedPane parent;

        public TabPane(JTabbedPane parent) {
            this.parent = parent;
            setLayout(new GridBagLayout());
            JButton btn = new JButton("Close");
            add(btn);

            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    parent.remove(TabPane.this);
                }
            });
        }

    }

}