如何即时更新多个 JPanel?

How to instantly update across many JPanels?

一段时间以来,我一直在研究跨 JPanel 的通信、事件处理和监听。我将首先尝试在没有代码的情况下描述我的问题,因为我觉得它更像是一个设计模式障碍。

所以我在自定义 JFrame 中有三个自定义 JPanel,每个都有自己的实例变量和 Actionlisteners。 ActionListeners 目前会在变量发生变化时更新变量。

但问题是,我希望一个面板中的 ActionListener 关注其他面板中的元素。因此,如果我在面板 B 中有一个框并且我更改了它的值,我希望面板 C 中的标签也更改。

我对这个话题进行了很多研究,from Whosebug answers to documentation on the topic。但我很难把它们放在一起。特别是当我将我的自定义面板分成不同的 类 时。谁能帮忙总结一下它应该是什么样子的?

最终,您在这里需要的是在面板 B 的文本框中注册一个 ActionListener,以更新面板 C 的标签。 B 组和 C 组不同 类 的事实只是道路上的一个小颠簸。设置此 ActionListener 的代码只需要能够获取对 1) 我们有兴趣观察其操作的文本字段,以及 2) 我们有兴趣更改其文本的标签的引用。

现在,如果面板 B 和面板 C 不是分开的 类,我们可能只会在我们的 JFrame window 的成员变量中方便地引用文本字段和标签。但是 B 组和 C 组 是分开的 类,所以我们需要寻求他们的帮助。嗯,实际上,ask 不如 demand 靠一点重新编程...

首先,让面板 B 使用 getter 方法公开文本字段:

public class PanelB extends JPanel {
    // ...
    private JTextField textBox;
    // ...
    public JTextField getTextBox(){
        return textBox;
    }
}

然后,用getter方法暴露面板C的标签:

class PanelC extends JPanel {
    // ...
    private JLabel label;
    // ...
    public JLabel getLabel() {
        return label;
    }
}

现在您可以按通常的方式设置 ActionListener

class MyFrame extends JFrame {

    PanelB panelB = new PanelB();
    PanelC panelC = new PanelC();

    public MyFrame()
    {
        // ...
        final JTextField panelBtf = panelB.getTextBox();
        final JLabel panelClabel = panelC.getLabel();
        panelBtf.addActionListener(
            new ActionListener() {
            public void actionPerformed(ActionEvent ae)
            {
                panelClabel.setText(panelBtf.getText());
            }}
        );
    }
}