用于无名 JButton 的 Java actionListener?
-
08-07-2019 - |
题
我想知道是否有一种方法可以为没有名称的 Jbutton 实现动作侦听器。例如,我有以下 for 循环,为字母表中的每个字母创建一个按钮。
for (int i = 65; i < 91; i++){
alphabetPanel.add(new JButton("<html><center>" + (char)i));
}
有没有一种方法可以为每个按钮添加一个动作侦听器,而无需摆脱 for 循环并对每个 JButton 进行硬编码,然后为每个按钮创建一个动作侦听器?
提前致谢,
托梅克
解决方案
你的问题有点模糊。修改循环以在循环内添加侦听器将是微不足道的:
ActionListener listener = something;
for (int i = 65; i < 91; i++){
JButton button = new JButton("<html><center>" + (char)i);
button.addActionListener( listener );
alphabetPanel.add(button);
}
如果您无法修改循环,您可以迭代面板的所有子项,并向任何属于 jbutton 的子项添加侦听器。
另外为什么要使用 html 使文本居中?这不是太过分了吗?jbutton 不是已经居中文本了吗?
您也可以使用 setHorizontalAlignement(SwingConstants.CENTER) 来执行此操作。
其他提示
这样做有什么问题?
for (int i = 65; i < 91; i++){
JButton button = new JButton("<html><center>" + (char)i));
button.addActionListener( new ButtonListener());
alphabetPanel.add(button);
}
...
class ButtonListener implements ActionListener {
ButtonListener() {
}
public void actionPerformed(ActionEvent e) {
//TODO:
}
}
此外,如果按钮的文字没有标识按钮,您可以使用字母表字母设置按钮的名称。
button.setName((char)i)); // or button.setName(i);
通过命名,您似乎意味着将按钮实例存储在您的立即方法的局部变量中。试图避免这种情况可能会使您的代码更难以阅读。但要回答你的问题:
最明显的方法是使用旧的但新近流行的双支撑成语。
alphabetPanel.add(new JButton("<html><center>" + (char)i) {{
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
...
}
});
}});
注意,在这种情况下,由于我不是最终的,因此无法从匿名内部类中使用它。将其分配给另一个(最终)变量或重新制定循环。
另一条路线是通过动作。 (通常我建议避免使用动作,因为它们是一个穷人的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) {
...
}
});
}
可以将ActionListener添加到匿名组件,如下所示:
new JButton().addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO your action
}
});
但是,在您尝试将匿名JButton添加到面板的情况下,此方法将无法工作,因为将采用addActionListener方法的返回类型(无效)而不是JButton的构造函数,如下所示:
for (int i = 65; i < 91; i++){
alphabetPanel.add(new JButton("<html><center>" + (char)i).addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO your action
}
}));
}
上面的代码抱怨了panel.add()方法的无效参数。
因此,在您的情况下,您将必须创建JButton的命名实例。
希望这澄清。
最诚挚的问候, 苏雷什