为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕的地6264312 2021-05-06 14:15:50
在我的代码的这一部分中,我想计算用户按下按钮的次数。问题是,如果我声明该数字以计算该函数外部的点击次数,那么它根本不会执行。这是我的意思:byte numButtonClicks = 0;    tellingIntroButton.addActionListener(e -> {        numButtonClicks ++;        System.out.println(numButtonClicks);    });在内部声明它也不是一个选择,因为它将始终被重置。谢谢你的帮助!
查看完整描述

2 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

如果你有类似的东西


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。


查看完整回答
反对 回复 2021-05-19
?
米脂

TA贡献1836条经验 获得超3个赞

您能让我知道您得到的确切错误是什么。如果numButtonClicks是局部变量,则无法在lambda函数中对捕获的局部变量进行突变。使它成为一个LongAdder类变量,该变量是原子的并为并发而设计。


  LongAdder numButtonClicks= new LongAdder();


              tellingIntroButton.addActionListener(e -> {

                    numButtonClicks.increment();

                    System.out.println(numButtonClicks);

                }); 


查看完整回答
反对 回复 2021-05-19
  • 2 回答
  • 0 关注
  • 188 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信