在JTabbedPane中,我将自定义数据对象与每个添加的选项卡相关联。选择选项卡时,我还有一个相应的Metadata对象,该对象显示在另一个面板中。我现在遇到的问题是,当关闭选项卡时,元数据面板会在刚刚关闭的选项卡中显示Data对象的元数据。理想情况下,我希望面板显示用户看到的“焦点对准”选项卡的元数据。但是,关闭标签页的行为意味着“选定的标签页”是被关闭的标签页,因此tabpane.getSelectedIndex()
不起作用。关闭标签后如何获得焦点突出的标签?预先谢谢你!
答案 0 :(得分:1)
细节中没有魔鬼,您没有提供。
我进行了快速测试,发现ChangeListener
在ContainerListener
之前被调用,这确实很痛苦,但是,它始终报告正确的索引。
因此,您需要做的是将两者结合在一起,以便在调用它们时都会更新元数据窗格。
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);
}
});
}
}
}