许多按钮执行类似的任务 - 有没有办法简化actionPerformed?

时间:2012-01-17 11:52:06

标签: java swing user-interface action

我目前有一组按钮,当按下它们时,用它们的值更新数组的元素,然后关闭包含它们的帧。

目前,他们的行动如下:

...
svwnb.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            input[5] = svwnb.getText();
            dftframe.setVisible(false);
        }
    });
    blypb.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            input[5] = blypb.getText();
            dftframe.setVisible(false);
        }
    });
    pw91b.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            input[5] = pw91b.getText();
            dftframe.setVisible(false);
        }
    });
    b97db.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            input[5] = b97db.getText();
            dftframe.setVisible(false);
        }
    });
    pbepbesolb.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            input[5] = pbepbesolb.getText();
            dftframe.setVisible(false);
        }
    });
...

有没有办法将其简化为一个简单的方法?我有一种感觉,我需要使用getSource()方法,但我没有构建像这样的动作方法的经验。

为了更简洁,我知道代码看起来像下面的伪代码:

 public void actionPerformed(ActionEvent e){
     input[5] = e.getSource().getText();
     dftframe.setVisible(false);
 }

我只是不知道如何生成此代码。

3 个答案:

答案 0 :(得分:2)

您可以通过以下方式定义ActionListener:

ActionListener commonListener = new ActionListener() {

    public void actionPerformed(ActionEvent e) {
        Object o = e.getSource();
        if (o instanceof JTextField) {
            JTextField textField = (JTextField)o;
            input[5] = textField.getText();
            textField.setVisible(true);
        }
    }
};

通过将其添加到每个组件来使用它:

svnwnb.addActionListener(commonListener);
...

答案 1 :(得分:1)

你的psudo代码中还有一个额外的e,否则一切都应该正常。

input[5] = e.getSource().e.getText(); 
                         ^

这应该是

input[5] = e.getSource().getText();

您可能需要额外投射到e.getSource()之类的东西(不确定是否需要)

input[5] = ((JButton)e.getSource()).getText();

在ActionEvent中还有一个getActionCommand方法可以使用,但只有在按钮中设置了正确的actionCommand时它才会起作用。

答案 2 :(得分:-1)

回顾源对象真的很脏。除此之外,来源通常令人惊讶或无证。只需为每个按钮使用不同的侦听器实例:

    addTextAction(svwnb);
    addTextAction(blypb);
    addTextAction(pw91b);
    addTextAction(b97db);
    addTextAction(pbepbesolb);
    ...

private void addTextAction(final AbstractButton button) {
    button.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            input[5] = button.getText();
            dftframe.setVisible(false);
        }
    });
}

(将按钮与文本链接似乎有点令人讨厌。应该明白如何在这里拆分(如果你试图通过获取事件源来破解它,那就更不用了)。)