猿问

如何使用Lambda表达式计算按钮点击次数?

在我的代码的这一部分中,我想计算用户按下按钮的次数。问题是,如果我声明该数字以计算该函数外部的点击次数,那么它根本不会执行。这是我的意思:


byte numButtonClicks = 0;


    tellingIntroButton.addActionListener(e -> {

        numButtonClicks ++;

        System.out.println(numButtonClicks);

    });

在内部声明它也不是一个选择,因为它将始终被重置。谢谢你的帮助!


慕的地6264312
浏览 189回答 2
2回答

胡子哥哥

如果你有类似的东西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);        });    }    // ...}您会遇到一些问题。匿名内部类(例如您的动作侦听器)中使用的变量必须隐式为final。您在对另一个答案的评论中提到的例外,Exception in thread "main" java.lang.Error: Unresolved compilation problem: Local variable numButtonClicks defined in an enclosing scope must be final or effectively final告诉您计数器变量不是最终变量您正在使用一个byte字段作为计数器。为什么不选择aint或a long?您不能声明finalint或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是局部变量,则无法在lambda函数中对捕获的局部变量进行突变。使它成为一个LongAdder类变量,该变量是原子的并为并发而设计。  LongAdder numButtonClicks= new LongAdder();              tellingIntroButton.addActionListener(e -> {                    numButtonClicks.increment();                    System.out.println(numButtonClicks);                }); 
随时随地看视频慕课网APP

相关分类

Java
我要回答