Java 如何跨多个JPanel即时更新?

Java 如何跨多个JPanel即时更新?,java,swing,jframe,jpanel,actionlistener,Java,Swing,Jframe,Jpanel,Actionlistener,我一直在研究JPanels上的沟通、事件处理和倾听。我将首先尝试在没有代码的情况下描述我的问题,因为我觉得这更像是设计模式的障碍 因此,我在自定义JFrame中有三个自定义JPanel,每个都有自己的实例变量和ActionListener。此时,ActionListeners会在变量内部发生更改时更新变量 但关键是,我希望一个面板中的ActionListener关注其他面板中的元素。因此,如果我在面板B中有一个框,并且我改变了它的值,我希望面板C中的标签也改变 关于这个话题,我做了很多研究。但我

我一直在研究JPanels上的沟通、事件处理和倾听。我将首先尝试在没有代码的情况下描述我的问题,因为我觉得这更像是设计模式的障碍

因此,我在自定义JFrame中有三个自定义JPanel,每个都有自己的实例变量和ActionListener。此时,ActionListeners会在变量内部发生更改时更新变量

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


关于这个话题,我做了很多研究。但我很难把这一切都整合起来。特别是当我将自定义面板划分为不同的类时。有人能帮你总结一下它应该是什么样子吗?

最终,你需要在面板B的文本框中注册一个
ActionListener
,更新面板C的标签。事实上,B区和C区属于不同的等级,这只是道路上的一个小碰撞。设置此
ActionListener
的代码只需能够获取对以下内容的引用:1)我们有兴趣观察其操作的文本字段,2)我们有兴趣更改其文本的标签

现在,如果Panel B和Panel C不是单独的类,我们可能只会在JFrame窗口的成员变量中方便地放置对文本字段和标签的引用。但是面板B和面板C是独立的类,所以我们需要寻求他们的帮助。实际上,与其说是要求,不如说是通过一点重新编程来要求

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

public class PanelB extends JPanel {
    // ...
    private JTextField textBox;
    // ...
    public JTextField getTextBox(){
        return textBox;
    }
}
class PanelC extends JPanel {
    // ...
    private JLabel label;
    // ...
    public JLabel getLabel() {
        return label;
    }
}
然后,使用getter方法公开面板C的标签:

public class PanelB extends JPanel {
    // ...
    private JTextField textBox;
    // ...
    public JTextField getTextBox(){
        return textBox;
    }
}
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());
            }}
        );
    }
}    

你的问题很宽泛,很可能太宽泛了,任何人能对你说的最好的话就是看一看并研究模型视图控制器,并遵循这个。你链接到的另一个问题(我已经回答了)比你的问题要好得多,因为它显示了一些真实的代码。请考虑做同样的事情。不要发布你所有的代码,只是一个不错的表达。啊,我想我明白了。那么它是关于将这些面板中的元素公开给frame类,然后在那里实现动作监听器?如果是这样的话,这是很有道理的;我的错误是将所有面板元素和它们的侦听器都包含在各自的类中,这意味着它们无法看到对方。如果我不那么感激的话,我会觉得自己是个白痴,因为我没有这么早见到你。非常感谢您,您给出答案的方式和示例的使用正是我所需要的。我在接下来的六个小时内无法尝试并确认,但我期待着这样做。@Sammieo:为什么你没有按要求发布代码?