java - 不能引用非最终变量

标签 java user-interface anonymous-class swing

我正在尝试用 Java 创建简单的 GUI 程序,但我找不到正确的解决方案来解决无法引用在不同方法中定义的内部类中的非最终变量的错误。

这是我到目前为止的小代码;

myPanel = new JPanel();

JButton myButton = new JButton("create buttons");
myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        int val = Integer.parseInt(textfield.getText());
        for(int i = 0; i < val; i++) {
            JButton button = new JButton("");
            button.setText(String.valueOf(i));
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    clickButton(i);
                }
            });
            myPanel.add(button);
            myPanel.revalidate();
        }
    }
});

也许我的做法是完全错误的。我想做的是;我想创建一组按钮,当用户按下按钮时,我想显示一条消息,例如“您按下了按钮 4”或“您按下了按钮 10”。

最佳答案

i 必须是 final 以便内部类访问它。您可以通过将其复制到最终变量来解决此问题。

但我建议将 for 循环的内容重构为一个单独的方法,如下所示:

for(int i = 0; i < val; i++) {
    myPanel.add(makeButton(i));
    myPanel.revalidate();
}

...

private JButton makeButton(final int index) {
    JButton button = new JButton("");
    button.setText(String.valueOf(index));
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            clickButton(index);
        }
    });

    return button;
}

关于java - 不能引用非最终变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3809729/

相关文章:

java - java从结果集中获取数据

java 字符串操作,将多条斜线改为一条斜线

c# - 如何使用 xamarin 以编程方式制作按钮?

java - JavaFX TextArea 中的 Tab 键导航

java - 返回一个使用最终原语的匿名类。它是如何工作的?

java - java中文件加载完成检查

java - 只有常量的接口(interface)

java - 寻找更好的方法让JLabel淡入/淡出

java - 匿名可运行和内存泄漏

java - 匿名类的限制