2015-10-07 133 views
1

你好,我一直在坚持如何使一个按钮显示一个随机number.this是我现在的位置。我无法弄清楚随机数发生器代码的去向。如果我将它放在ActionListener之前,只需在按钮旁边张贴,而不是在按下按钮时出现。它不断给我的错误信息如何在用户按下按钮时显示按钮并显示随机数?

错误:无法引用在封闭范围内定义的非最终局部变量num1。

请参考下面的代码:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JOptionPane; 
import java.util.Random; 

public class myTest { 

    public static void main(String[] args) { 

     Random generator = new Random(); 
     int num1; 

     final JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(); 

     num1 = generator.nextInt(101); 
     System.out.println("the random number is:" +num1); 

      JButton button1 = new JButton("Push Me!"); 

     frame.add(panel); 
     panel.add(button1); 
     frame.setVisible(true); 

     button1.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent arg0) { 
      num1 = generator.nextInt(101); 
     System.out.println("the random number is:" +num1); 
      } 
     }); 

    } 

} 
+1

的[无法指非最终变量在不同的方法定义的内部类中]可能的复制(http://stackoverflow.com/questions/1299837/cannot-refer一个非最终变量在内部类中定义的差异) –

回答

2

您可以致电setTextJButton。另外,不要忘记设置默认关闭操作。你不能从外部范围引用num1。我想你想要的东西,像

Random generator = new Random(); 
final JFrame frame = new JFrame(); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
JPanel panel = new JPanel(); 

int num1 = generator.nextInt(101); 
System.out.println("the random number is:" + num1); 

JButton button1 = new JButton(String.format("Push Me! %d", num1)); 
frame.add(panel); 
panel.add(button1); 
frame.pack(); 
frame.setVisible(true); 

button1.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent arg0) { 
     int num1 = generator.nextInt(101); 
     System.out.println("the random number is:" + num1); 
     button1.setText(String.format("Push Me! %d", num1)); 
    } 
}); 
+0

我仍然收到相同的错误消息。我使用了你输入的内容。 –

+0

@sawg我在Java 8中测试了我的例子。上面是主要的方法,它在这里工作。 –

0

错误涉及num1被声明为与main上下文中的局部变量,但其可以在将来的某一时刻被改变的事实。

看一看Referencing non-final variable: why does this code compile?更多的解释

相反,因为它不需要直到ActionListener叫,只是使它提供给ActionListener本身

button1.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent arg0) { 
     int num1 = generator.nextInt(101); 
     System.out.println("the random number is:" + num1); 
    } 
});