Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用lambda表达式计算按钮点击次数?_Java_Swing_Lambda_Jbutton - Fatal编程技术网

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);
        });
    }

    // ...
}
你会遇到一些问题

  • 匿名内部类(如操作侦听器)中使用的变量必须是隐式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
    
  • 告诉您计数器变量不是final

  • 您正在使用
    字节
    字段作为计数器。为什么不是
    int
    long

  • 不能在方法中声明final
    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++来更改它。您必须在堆中而不是在函数堆栈中有效地创建变量