用于无名JButton的Java actionListener?

时间:2008-11-11 23:42:33

标签: java swing jbutton actionlistener

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

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

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

提前致谢,

托梅克

4 个答案:

答案 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不是中心文本吗? 您也可以使用setHorizo​​ntalAlignement(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的命名实例。

希望这澄清。

最诚挚的问候, 苏雷什