java - 当值发生变化时,面板上的组件如何向面板外的其他组件发出警报?

标签 java swing

我正在编写一个 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/

相关文章:

java - 如何调整 JButton 的大小

java - 在 Java 中解析 HTML 字符串中的数字

java - Eclipse 在运行时无法正确启动我的程序

java - JFrame:如何添加一个向框架添加新文本字段的按钮?

java - 当我将字符串拆分为 2 个单词并交换它们时出现错误

java - 如何通过跳过换行符将文本区域内容替换为 "*"

java - 更改JComboBox的标签

java - 加载 JSON 文件,迭代条目并在 Java 中编辑它们

java - 打印连续数字

java - Try-with-resources 和 ServerSockets