我怎样才能使我的动作监听器类使用相同的int count变量?

时间:2016-02-05 12:43:33

标签: java user-interface actionlistener

我正在创建一个带有递增和重置JButton的简单GUI以及一个输出计数数字的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。我试图弄清楚我的代码有什么问题但却找不到它是什么。

1 个答案:

答案 0 :(得分:1)

使用文本字段(基本上是一个字符串)来处理计数值不是一个好的设计方法。您获得的例外是您在文本字段中存储的文本的结果:"按钮单击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));

看到动作侦听器获得对一个计数器的相同引用。显然,你必须以这种方式设计你的动作听众:

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