通过命名,您似乎是指将按钮实例存储在即时方法的局部变量中。试图避免这种情况可能会使您的代码更难阅读。但要回答你的问题:
最明显的方法是使用旧的但最近流行的双括号成语。
alphabetPanel.add(new JButton("<html><center>" + (char)i) {{
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
...
}
});
}});
请注意,在这种情况下,因为 i 不是 final ,所以它不能从匿名内部类中使用。将其分配给另一个(最终)变量或重新构造循环。
另一条路线是通过一个动作。(通常我建议避免使用 Actions,因为它们只是一个穷人的 Hashtable。ButtonModel 是“好”的。)
alphabetPanel.add(new JButton(new AbstractAction("<html><center>" + (char)i) {
public void actionPerformed(ActionEvent event) {
...
}
}));
然后当然有应用程序特定的库方式:
Form alphabetForm = new Form(alphabetPanel);
for (char c='A'; c <= 'Z'; ++c) {
alphabetForm.button("<html><center>" + c, new ActionListener() {
public void actionPerformed(ActionEvent event) {
...
}
});
}