在 ActionPerformed 上更改 GridLayout 中的 JButton 文本

Changing JButton text in GridLayout on ActionPerformed

我试图在单击时更改 JButton 文本。按钮在 GridLayout 中排列在数组中。我尝试使用 .setText,但 NetBeans 显示错误。

local variables referenced from an inner class must be final or effectively final

将变量从 private 更改为 final 没有帮助。我是 Java 的菜鸟,如果有任何帮助,我将不胜感激。

   package widok;

   import java.awt.GridLayout;
   import java.awt.event.ActionEvent;
   import java.awt.event.ActionListener;
   import javax.swing.JButton;
   import javax.swing.JFrame;

   public class Gameplay extends JFrame {

private JButton[] button = new JButton[25];

public Gameplay() {

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    getContentPane().setLayout(new GridLayout(5, 5));

    for (int i = 0; i < 25; i++) {
        button[i] = new JButton(" ");

        button[i].addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                button[i].setText("X");
            }
        });

        getContentPane().add(button[i]);

    }

    pack();
    setVisible(true);

}

}

谢谢!

这里的问题是 "i",它具有 for 循环的本地上下文,但 actionPerformed 不在同一上下文中。因为 "i" 正在更改,所以不能最终确定

你可以做什么 发布动作源,例如可以从Actionaevent中获取

        public void actionPerformed(ActionEvent ae) {
            JButton btn = (JButton)ae.getSource();
            btn.setText("X");