在我的应用程序中,我有几个自定义JPanel添加到JTabbedPane。单个JPanel提供了一项功能,我已将它们添加到JTabbedPane中,以便用户可以轻松地在模块之间切换。
所有这些自定义JPanel都在同一组数据上运行,这意味着如果其中一个模块必须更改数据中的某些内容(例如,List),则所有其他面板应该知道该更改并做出相应的反应。
然而,使用JTabbedPane,您首先需要实例化那些JPanel以将它们添加到JTabbedPane - 并且您只需执行一次。
我有一个问题 - 假设用户在面板A中添加了一些内容(由所有这些面板共享)并切换到面板B.在这种情况下会发生什么? B怎么会知道有什么东西被添加到那个集合中?
我的想法是简单地检测制表符切换事件,并调用B的方法来考虑新数据。但我觉得这不是应该怎么做的。
你有什么建议吗?
答案 0 :(得分:2)
在下面的示例中,选项卡式窗格中的每个面板都有自己的JComboBox
,可以侦听公共ComboBoxModel
。更新通用模型后,通过单击 Update ,每个监听JComboBox
都会看到更改。
我从不需要任何两个组合框来共享模型。我的面板包含完全不同的
JComponent
个实例,但这些组件显示的外观和数据取决于所有这些面板共有的几个集合。
您可以利用observer pattern,检查here。具体细节取决于您的使用案例,但PropertyChangeListener
示例值得研究。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.util.Date;
import javax.swing.AbstractAction;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
/**
* @see https://stackoverflow.com/a/37514928/230513
* @see https://stackoverflow.com/questions/8752037
* @see https://stackoverflow.com/a/37222598/230513
*/
public class TabTest {
private static final int N = 5;
private final JTabbedPane pane = new JTabbedPane();
private final DefaultComboBoxModel model = new DefaultComboBoxModel(
new String[]{"Alpher", "Bethe", "Gamow", "Dirac", "Einstein"});
public TabTest() {
for (int i = 0; i < N; i++) {
Color color = Color.getHSBColor((float) i / N, 1, 1);
pane.add("Tab " + String.valueOf(i), new TabContent(i, color));
}
}
private class TabContent extends JPanel {
private TabContent(int i, Color color) {
setOpaque(true);
setBackground(color);
add(new JComboBox(model));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(320, 240);
}
}
private void display() {
JFrame f = new JFrame("TabColors");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(pane);
JPanel p = new JPanel(new FlowLayout(FlowLayout.RIGHT));
p.add(new JButton(new AbstractAction("Update") {
@Override
public void actionPerformed(ActionEvent e) {
model.addElement(new Date());
}
}));
f.add(p, BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new TabTest().display();
}
});
}
}