netbeans MouseEvent中的“从内部类引用的局部变量必须是final或有效final”

jbose2ul  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(163)

我尝试从jtextfield获取整数输入,并在单击jbutton时将其设置为计时器jlabel的整数,但在MouseEvent方法中不断出现此错误
从内部类引用的局部变量必须是final或有效final
编码:

private void timerStartMouseClicked(java.awt.event.MouseEvent evt) {                                        
        int a = Integer.parseInt(timerInput.getText());
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {         
            public void run() {  
                timeLeft.setText(Integer.toString(a));
                --a;
                if (a == -1){
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
                    timer.cancel();                                       
                } else if(isRunning){
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
                }
            }
        };
    timer.scheduleAtFixedRate(task, 1000, 1000);
    }

我对计时器事件和鼠标事件还是个新手,我试图将a声明为全局变量,这仍然会给我带来同样的错误,除非我在方法中声明它是一个值,但我需要从jtextfield获得输入。

qgelzfjb

qgelzfjb1#

没有测试过,但我认为这会起作用。

private void timerStartMouseClicked(java.awt.event.MouseEvent evt) {                                        
        final int a = Integer.parseInt(timerInput.getText());
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {    
            int localCount = a;     
            public void run() {  
                timeLeft.setText(Integer.toString(localCount));
                --localCount;
                if (localCount == -1){
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
                    timer.cancel();                                       
                } else if(isRunning){
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
                }
            }
        };
    timer.scheduleAtFixedRate(task, 1000, 1000);

当这个方法结束时,a作为一个局部变量会消失,因此使用它是不安全的。如果变量是final,那么Java可以安全地将a的值复制到内部类中。但是,您需要修改a,这样常量值就不起作用了。
所以我们只需要把值复制到一个不同的变量中,一个 * 在 * 内部类中的变量,这样一切都可以正常工作了,因为现在内部类有了自己的变量。

相关问题