如何即时更新多个JPanels?

时间:2017-09-30 01:07:47

标签: java swing jframe jpanel actionlistener

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

所以我在自定义JFrame中有三个自定义JPanel,每个都有自己的实例变量和Actionlisteners。只要在其中发生更改,ActionListener就会更新变量。

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

我已就{} 3 from stackoverflow answers上的documentationthe topic对该主题进行了大量研究。但我很难把它们放在一起。特别是当我将自定义面板分成不同的类时。任何人都可以帮助总结一下它的样子吗?

1 个答案:

答案 0 :(得分:1)

最终您需要在Panel B的文本框中注册ActionListener,以更新Panel C的标签。 Panel B和Panel C是不同类别的事实只是道路上的一个小小的障碍。设置此ActionListener的代码只需要能够获得对以下内容的引用:1)我们感兴趣观察其操作的文本字段,以及2)我们感兴趣的文本更改的标签。

现在,如果Panel B和Panel C不是单独的类,我们可能只会引用文本字段并在JFrame窗口的成员变量中轻松地放置标签。但是Panel B和Panel C 单独的类,所以我们需要请求他们的帮助。嗯,实际上,并不是通过一点点重新编程来要求作为需求 ......

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

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

然后,使用getter方法公开Panel 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());
            }}
        );
    }
}