如何即时更新多个 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());
}}
);
}
}
一段时间以来,我一直在研究跨 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());
}}
);
}
}