我想知道是否有办法为没有名字的Jbutton实现一个动作监听器。例如,我有以下for循环,为字母表中的每个字母创建一个按钮。
for (int i = 65; i < 91; i++){
alphabetPanel.add(new JButton("<html><center>" + (char)i));
}
有没有一种方法可以为每个按钮添加一个动作监听器,而无需摆脱我的for循环和硬编码每个JButton,然后为每个按钮创建一个动作监听器?
提前致谢,
托梅克
答案 0 :(得分:4)
你的问题有点模糊。修改循环以在循环中添加侦听器是非常简单的:
ActionListener listener = something;
for (int i = 65; i < 91; i++){
JButton button = new JButton("<html><center>" + (char)i);
button.addActionListener( listener );
alphabetPanel.add(button);
}
如果您无法修改循环,则可以迭代所有面板的子节点,并将侦听器添加到任何jbuttons子节点。
为什么你使用html来居中文本?是不是有点矫枉过正? jbutton不是中心文本吗? 您也可以使用setHorizontalAlignement(SwingConstants.CENTER)来执行此操作。
答案 1 :(得分:2)
这样做有什么问题?
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);
答案 2 :(得分:1)
通过命名,您似乎意味着将按钮实例存储在您的立即方法的局部变量中。试图避免这种情况可能会使您的代码更难以阅读。但要回答你的问题:
最明显的方法是使用旧的但新近流行的双支撑成语。
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) {
...
}
});
}
答案 3 :(得分:0)
可以将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的命名实例。
希望这澄清。
最诚挚的问候, 苏雷什