我正在创建一个简单的 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/