这是一个非常引人注目的问题,但我无法解决这个问题。我有一个JButton
和一个变量。简而言之,单击按钮时需要更改变量的值。由于event listener
中的变量只能采用final
个变量,因此无法正常工作。问题是,变量需要改变,所以它不能是final
。我已经完成了一些阅读,并尝试将count
设为类变量,但static
与not-static
存在问题。这是我所拥有的简单版本:
public static void main(String[] args) {
int count = 0;
JFrame frame = new JFrame("Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setLayout(null);
panel.setBackground(Color.WHITE);
frame.add(panel);
panel.setSize(frame.getSize());
JButton button = new JButton("Click Me");
button.setBounds(50,50,100,50);
panel.add(button);
JLabel counter = new JLabel(""+count);
counter.setBounds(50,100,100,50);
panel.add(counter);
frame.setSize(500,500);
frame.setVisible(true);
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
count++;
counter.setText(""+count);
}
});
}
我得到的确切错误是:
local variables referenced from an inner class must be final or effectively final.
答案 0 :(得分:1)
如果你将事件监听器中的项声明为全局静态变量,就可以这样做:
private static int count = 0;
private static JLabel counter;
public static void main(String[] args) {
...
}
然后从主块中删除声明,即:
int count = 0;
变为count = 0;
和
JLabel counter = new JLabel(""+count);
counter.setBounds(50,100,100,50);
panel.add(counter);
变为:
counter = new JLabel(""+count);
counter.setBounds(50,100,100,50);
panel.add(counter);
这将允许按钮的动作侦听器访问值并更改它们。在声明它们的地方(计数器将抛出相同的问题)final不允许它们的值被主动改变和递增。
答案 1 :(得分:-1)