我一直在研究JPanels之间的沟通,事件处理和倾听。我将尝试在没有代码的情况下首先描述我的问题,因为我觉得它更像是一种设计模式障碍。
所以我在自定义JFrame中有三个自定义JPanel,每个都有自己的实例变量和Actionlisteners。只要在其中发生更改,ActionListener就会更新变量。
但问题是,我希望ActionListener在一个面板中注意其他面板中的元素。因此,如果我在Panel B中有一个框并且我更改了它的值,我希望Panel C中的标签也会改变。
我已就{} 3 from stackoverflow answers上的documentation到the topic对该主题进行了大量研究。但我很难把它们放在一起。特别是当我将自定义面板分成不同的类时。任何人都可以帮助总结一下它的样子吗?
答案 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());
}}
);
}
}