1

我正在尝试在 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”。

4

3 回答 3

7

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;
}
于 2010-09-28T04:49:34.683 回答
1

为避免此问题,您必须将 myPanel 声明为类的成员变量,或者使用引用类成员的其他内容。

于 2010-09-28T04:49:05.447 回答
1

匿名类只能使用声明为 final 的局部变量,以保证它们不会改变。

于 2010-09-28T04:56:15.903 回答