将JTabbedPane与需要共享数据的JPanel一起使用

时间:2016-05-29 18:39:47

标签: java swing jtabbedpane

在我的应用程序中,我有几个自定义JPanel添加到JTabbedPane。单个JPanel提供了一项功能,我已将它们添加到JTabbedPane中,以便用户可以轻松地在模块之间切换。

所有这些自定义JPanel都在同一组数据上运行,这意味着如果其中一个模块必须更改数据中的某些内容(例如,List),则所有其他面板应该知道该更改并做出相应的反应。

然而,使用JTabbedPane,您首先需要实例化那些JPanel以将它们添加到JTabbedPane - 并且您只需执行一次。

我有一个问题 - 假设用户在面板A中添加了一些内容(由所有这些面板共享)并切换到面板B.在这种情况下会发生什么? B怎么会知道有什么东西被添加到那个集合中?

我的想法是简单地检测制表符切换事件,并调用B的方法来考虑新数据。但我觉得这不是应该怎么做的。

你有什么建议吗?

1 个答案:

答案 0 :(得分:2)

在下面的示例中,选项卡式窗格中的每个面板都有自己的JComboBox,可以侦听公共ComboBoxModel。更新通用模型后,通过单击 Update ,每个监听JComboBox都会看到更改。

  

我从不需要任何两个组合框来共享模型。我的面板包含完全不同的JComponent个实例,但这些组件显示的外观和数据取决于所有这些面板共有的几个集合。

您可以利用observer pattern,检查here。具体细节取决于您的使用案例,但PropertyChangeListener示例值得研究。

image

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();
            }
        });
    }
}