我正在创建一个带有递增和重置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。我试图弄清楚我的代码有什么问题但却找不到它是什么。
答案 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。