0

我想知道是否有一种方法可以为没有名称的 Jbutton 实现动作侦听器。例如,我有以下 for 循环,它为字母表的每个字母创建一个按钮。

for (int i = 65; i < 91; i++){
     alphabetPanel.add(new JButton("<html><center>" + (char)i));
}

有没有一种方法可以为每个按钮添加一个动作侦听器,而无需摆脱我的 for 循环并对每个 JButton 进行硬编码,然后为每个按钮创建一个动作侦听器?

提前致谢,

托梅克

4

4 回答 4

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);
}

如果您不能修改循环,您可以遍历面板的所有子级,并将侦听器添加到任何作为 jbutton 的子级。

还有你为什么要使用 html 来使文本居中?这不是矫枉过正吗?jbutton不是已经居中文本了吗?
你也可以使用 setHorizo​​ntalAlignement(SwingConstants.CENTER) 来做到这一点。

于 2008-11-11T23:51:11.610 回答
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);
于 2008-11-11T23:54:30.777 回答
1

通过命名,您似乎是指将按钮实例存储在即时方法的局部变量中。试图避免这种情况可能会使您的代码更难阅读。但要回答你的问题:

最明显的方法是使用旧的但最近流行的双括号成语。

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) {
            ...
        }
    });
}
于 2008-11-12T14:27:38.673 回答
0

可以将 ActionListener 添加到匿名组件,如下所示:

new JButton().addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO your action             
            }           
        });

但是,在您尝试将匿名 JButton 添加到面板的情况下,此方法将不起作用,因为将采用 addActionListener 方法的返回类型(为 void)而不是 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 的命名实例。

希望这可以澄清。

最好的问候, 苏雷什

于 2008-11-12T02:59:39.000 回答