我正在尝试用Java创建简单的GUI程序,我找不到正确的错误解决方案,不能引用在不同方法中定义的内部类中的非final变量。
到目前为止,这是我的小代码;
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”这样的消息。
答案 0 :(得分:7)
i
必须是最终的才能让内部类访问它。您可以通过将其复制到最终变量来解决此问题。
但是我建议将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;
}
答案 1 :(得分:1)
要避免此问题,您必须将myPanel声明为类的成员变量,或使用引用该类成员的其他内容。
答案 2 :(得分:1)
匿名类只能使用声明为final的局部变量,以确保它们不会更改。