final是可以的……只是不知道你有没有写对而已:
[code="java"]import java.awt.event.*;
import javax.swing.*;
public class Demo {
private static void populateGUI() {
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
frame.add(panel);
final JTextField field = new JTextField(5);
panel.add(field);
for (int i = 1; i <= 3; i++) {
final int j = i;
JButton button = new JButton(Integer.toString(i));
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
field.setText(Integer.toString(j));
}
});
panel.add(button);
}
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
populateGUI();
}
});
}
}[/code]
在这个ActionListener里用了两个局部变量,field和j,两个都必须声明为final。
声明为final之后变量就不可修改了,如果要在匿名内部类里修改外部变量的值的话,还是把要改的值写为成员变量吧……或者重新评估一下是否真的需要在内部类里去修改外部变量。