Java 如何使用lambda表达式计算按钮点击次数?
在我的代码的这一部分中,我想计算用户按下按钮的次数。问题是,如果我声明这个数字来计算函数外的点击次数,那么它根本不会去。我的意思是:Java 如何使用lambda表达式计算按钮点击次数?,java,swing,lambda,jbutton,Java,Swing,Lambda,Jbutton,在我的代码的这一部分中,我想计算用户按下按钮的次数。问题是,如果我声明这个数字来计算函数外的点击次数,那么它根本不会去。我的意思是: byte numButtonClicks = 0; tellingIntroButton.addActionListener(e -> { numButtonClicks ++; System.out.println(numButtonClicks); }); 在内部声明它也不是一个选项,因为它总是会被重置
byte numButtonClicks = 0;
tellingIntroButton.addActionListener(e -> {
numButtonClicks ++;
System.out.println(numButtonClicks);
});
在内部声明它也不是一个选项,因为它总是会被重置。
谢谢你的帮助 您能告诉我您得到的确切错误是什么吗?如果numButtonClicks是一个局部变量,您不能在lambda函数中对捕获的局部变量进行变异。使其成为一个LongAdder类变量,它是原子的,专为并发而设计
LongAdder numButtonClicks= new LongAdder();
tellingIntroButton.addActionListener(e -> {
numButtonClicks.increment();
System.out.println(numButtonClicks);
});
如果你有
public class YourComponent extends JFrame { // or whatever it is you're extending
// ....
public void init() {
// ...
byte numButtonClicks = 0;
tellingIntroButton.addActionListener(e -> {
numButtonClicks ++;
System.out.println(numButtonClicks);
});
}
// ...
}
你会遇到一些问题
Exception in thread "main" java.lang.Error: Unresolved compilation problem: Local variable numButtonClicks defined in an enclosing scope must be final or effectively final
字节
字段作为计数器。为什么不是int
或long
int
或long
,并对其进行递增public class YourComponent extends JFrame { // or whatever it is you're extending
// ....
private int numButtonClicks = 0;
public void init() {
// ...
tellingIntroButton.addActionListener(e -> {
YourComponent.this.numButtonClicks++;
System.out.println(numButtonClicks);
});
}
// ...
}
或者,有点像另一个答案所建议的,如果并发性对您来说是一个问题(如果计数可以由不同的线程修改),您可以使用java8对象,例如
LongAdder
。如果你走这条路线(LongAdder
),如果你在一个方法的范围内声明它,它需要被声明为final。你能发布更多的代码吗?看起来你需要让你的numButtonClicks
成为一个类成员(我想它现在是在一个方法中定义的)。哦,好吧,这已经是一个很好的答案了!我不知道。如果这也不起作用,我将再次发布。“线程“main”java.lang中的异常。错误:未解决的编译问题:在封闭范围中定义的局部变量numbuttonclick必须是final或实际上是final”,这是错误消息。我真的不明白它想从我这里得到什么。是的,错误表明你不能在lamda函数中改变局部变量的值。在您的例子中,您通过递增numButtonClicks++来更改它。您必须在堆中而不是在函数堆栈中有效地创建变量