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

Change variable value through event listener on JButton

这是一个非常菜鸟的问题,但我无法解决。我有一个 JButton 和一个变量。简而言之,单击按钮时需要更改变量的值。这是行不通的,因为 event listener 中的变量只能采用 final 变量。问题是,变量需要改变,所以它不能是 final。我读过一些书并试图让 count 成为一个 class 变量,但是 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.
final int count = 0;

看看这个post

Why are only final variables accessible in anonymous class?

如果您将事件侦听器中的项目声明为全局静态变量,则可以像这样完成此操作:

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 不允许主动更改和递增它们的值。