通过JButton上的事件侦听器更改变量值

时间:2015-05-10 18:47:51

标签: java variables jbutton

这是一个非常引人注目的问题,但我无法解决这个问题。我有一个JButton和一个变量。简而言之,单击按钮时需要更改变量的值。由于event listener中的变量只能采用final个变量,因此无法正常工作。问题是,变量需要改变,所以它不能是final。我已经完成了一些阅读,并尝试将count设为类变量,但staticnot-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.

2 个答案:

答案 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)

final int count = 0;

看看这篇文章

Why are only final variables accessible in anonymous class?