java - 如何才能使我的操作监听器类使用相同的 int count 变量?

标签 java user-interface actionlistener

我正在创建一个简单的 GUI,其中包含增量和重置 JButton 以及输出计数的 JTextField。 GUI 的布局很好,但我在实现操作监听器时遇到了麻烦,这里是我创建按钮并将关联的操作监听器分配给变量的地方:

        JTextField t = new JTextField(40);
        t.setText("Button Clicked " + 0 + " times");

        JButton b1 = new JButton("Increment");
        b1.addActionListener(new Incrementer(t));

        JButton b2 = new JButton("Reset");
        b2.addActionListener(new Reset(t));

这与其他布局规范属于同一类。这是我的增量器类,它应该将计数器增加 1:

class Incrementer implements ActionListener {
    JTextField t = new JTextField();

    public Incrementer (JTextField t) {
        this.t = t;
    }

    public void actionPerformed(ActionEvent e) {
        t.getText();
        int numClicks = Integer.parseInt(t.getText());
        numClicks++;
        t.setText("Button Clicked " + numClicks + " times");
    }}

以及我的重置类,它将计数重置为 0:

class Reset implements ActionListener {

JTextField t = new JTextField();
public int numClicks = 0;

public Reset (JTextField t) {
    this.t = t;
}

public void actionPerformed(ActionEvent e) {
    int numClicks = Integer.parseInt(t.getText());
    numClicks = 0;
    t.setText("Button Clicked " + numClicks + " times");
}}

我最初遇到一个问题,每个操作监听器都有自己的 numClicks 值,例如,我会单击增量计数器 3 次,然后重置为 0,当我再次单击增量时,它将恢复计数为 4 而不是 1在尝试修复该问题后,我现在甚至无法单击增量和重置按钮,因为我收到了一系列令人讨厌的错误,例如:java.lang.NumberFormatException。我试图找出我的代码出了什么问题,但无法找出问题所在。

最佳答案

使用文本字段(基本上是一个字符串)来处理计数值并不是一个好的设计方法。您得到的异常是您在文本字段中存储的文本的结果:“按钮单击 x 次”。这不是一个数字。

所以最好使用单独的模型。您可以添加一个新类来进行计数:

class Counter {
    private int count;
    int getCount() { return count; }
    void increment() { count += 1; }
    void reset() { count = 0; }
    // maybe some more methods ...
}

现在在你的 GUI 类中你要做:

Counter counter = new Counter();

JTextField t = new JTextField(40);
t.setText("Button Clicked " + 0 + " times");

JButton b1 = new JButton("Increment");
b1.addActionListener(new Incrementer(counter, t));

JButton b2 = new JButton("Reset");
b2.addActionListener(new Reset(counter, t));

查看操作监听器获得对一个计数器的相同引用。显然,您必须这样设计您的 Action 监听器:

class Incrementer implements ActionListener {
    private final Counter counter;
    private final JTextField textfield;
    Incrementer(Counter counter, JTextField textfield) {
        this.counter = counter;
        this.textfield = textfield;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        counter.increment();
        textfield.setText("Button Clicked " + counter.getCount() + " times");
    }
}

Reset 类看起来很类似。这有点像MVC .

关于java - 如何才能使我的操作监听器类使用相同的 int count 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35224584/

相关文章:

java - 启动 Maveryx 测试应用程序时如何指定环境变量?

ActionListener 中的 Java swing 问题

java - 在Java中,当我不在内部类中时如何访问外部类?

java - 如何从请求中获取MediaType

java - 如何配置磁盘缓存 jcs

c - 使用 Turbo C 在 C 语言中进行 GUI 编程

Java SWT : wrapping syncExec and asyncExec to clean up code

java - 为什么我的 "Save"按钮不起作用?

java - 在 Java 中使用多个具有相同标签的 JButton

java - 打破 Java redux 中的嵌套循环