我正在编写一个 Swing 程序,其中所有面板都被声明为单独的类和一个保存面板的 JFrame。输入面板有一个子面板,上面有许多按钮。当单击这些按钮之一并计算出一个值时,我想将该值传递回包含输入面板的 JFrame,以便该值可以用于许多其他计算。
我知道我可以使用 JFrame ActionListener 直接负责子面板上的按钮,但这似乎违反了可移植性、封装性或两者。我希望子面板能够独立工作,并让使用它的 JFrame 在某个值发生变化时意识到。
我更愿意将值保留为原始值,但如果只有一个对象可以工作,我可以这样做。
该程序已经作为一个类编写,并且运行良好,但编辑起来却很困难。当我完成后,我意识到不将其分成六个面板,每个面板作为自己的类是错误的。 future 项目的一个教训。因此,我正在重写它,并遇到了以下问题:JFrame 依赖于了解其面板之一(实际上是该面板上的面板)何时重新计算值。值计算不是问题,但 JFrame 需要知道它何时发生变化。
我希望这是清楚的。对我来说这似乎很清楚! :-)
以下代码是我想要做的事情的简化。
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
public class ChangeState extends JFrame {
// This is to receive the value when changed in ButtonPanel
private JTextField answer = new JTextField(5);
private InputPanel inputPanel = new InputPanel();
public ChangeState() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
add(inputPanel, BorderLayout.CENTER);
add(answer, BorderLayout.SOUTH);
pack();
setVisible(true);
}
public static void main(String[] args) {
ChangeState mf = new ChangeState();
}
}
class InputPanel extends JPanel {
private ButtonPanel buttonPanel = new ButtonPanel();
InputPanel() {
add(buttonPanel);
}
}
class ButtonPanel extends JPanel implements ActionListener {
private int value;
JButton b1 = new JButton("Value *2");
JButton b2 = new JButton("Value *3");
public ButtonPanel() {
value = 1;
b1.addActionListener(this);
add(b1);
b2.addActionListener(this);
add(b2);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == b1) {
value *= 2;
}
if (e.getSource() == b2) {
value *= 3;
}
System.out.println("Value: " + value);
/*
* How do I let ChangeState.answer know VALUE has changed and needs
* to be updated?
*/
}
}
最佳答案
您可以将 ChangeState 设置为 observer通过成为一个监听 ButtonPanel 的 ActionListener,或者成为您可以创建的更抽象的其他自定义观察者,您的 ButtonPanel 的属性。
当类观察不是另一个只有一个事件的 GUI 类时,我建议使用更抽象的自定义观察者,但在这种情况下,因为也许您可以只使用 ActionListener (另一方面,ChangeState 并不多) GUI 类的一部分,您可以使其由 JFrame 组成)。
如果您有多个可以通过该 ActionListener 传递的事件,那么您可能需要使 ChangeState 实现一个更抽象的观察者实现,以便您可以更好地区分事件。否则,您需要让 ChangeState 知道创建事件的一些不同 GUI 组件的名称,或者引用它们,这在设计上并不是很好。
关于java - 当值发生变化时,面板上的组件如何向面板外的其他组件发出警报?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23412704/