如何为多个JButton创建单个ActionListener

时间:2013-06-09 08:24:10

标签: java swing jbutton actionlistener

我正在使用MVC创建一个基本计算器。到目前为止,我正在调整一个教程,它只将两个用户输入的值相加。

目前我添加到视图中的每个按钮都有自己的监听器,这没关系。但是,根据教程的控制器每个按钮只有一个ActionListener内部类。这重复了大量的代码。

如何为所有按下的按钮创建一个ActionListener类,并在按下的按钮的id上使用case语句?

在视图中注册oneButton

void oneListener(ActionListener listenForOneButton){    
    oneButton.addActionListener(listenForOneButton);
}    

在Controller内部类中为oneButton实现ActionListener

class oneListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
        int previousNumber, displayNumber = 0;          
        try{
            previousNumber = theView.getPreviousDisplayNumber();
            displayNumber = previousNumber+1;               
            theView.setDisplayNumber(displayNumber);
        }           
        catch(NumberFormatException ex){                
            System.out.println(ex);             
            theView.displayErrorMessage("You Need to Enter Integers");              
        }           
    }
}

2 个答案:

答案 0 :(得分:2)

从实现ActionListener ...

的类开始
public class CalculatorHandler implements ActionListener{

    public static final String ADD_ACTION_COMMAND = "Action.add";

    public void actionPerformed(ActionEvent e){

        if (ADD_ACTION_COMMAND.equals(e.getActionCommand()) {
            // Do your addition...
        } else if ...

    }
}

最好定义此类可以处理的动作命令是常量,从而消除任何歧义......

接下来,在包含按钮的类中,创建ActionListener ...

的实例
CalculatorHandler handler = new CalculatorHandler();

然后按照惯例创建按钮并注册handler ...

JButton plus = new JButton("+");
plus.setActionCommand(CalculatorHandler.ADD_ACTION_COMMAND);
plus.addActionListener(handler);

这种方法唯一的问题,恕我直言,它可以创建一个可能难以维护的怪物if-else声明。

在我看来,我会创建某种模型/构建器,其中包含一系列辅助方法(如add(Number)subtract(Number)等)并使用Actions API进行个别操作对于每个按钮......但那只是我...

答案 1 :(得分:1)

public class SingleActionListener implements ActionListener {
    public void initializeButtons() {
        JButton[] buttons = new JButton[4];
        String[] buttonNames = new String[] {"button1", "button2", "button3", "button4"};

        for (int i = 0; i < 4; i++) {
            buttons[i] = new JButton(buttonNames[i]);
        }
    }

    public void addActionListenersToButtons() {
        for (int i = 0; i < 4; i++) {
            buttons[i].addActionListener(this);
        }
    }

    public void actionPerformedd(ActionEvent actionEvent) {
        if (actionEvent.getSource() == buttons[0]) {
            //Do required tasks.
        }

        if (actionEvent.getSource() == buttons[1]) {
            //Do required tasks.
        }

        if (actionEvent.getSource() == buttons[2]) {
            //Do required tasks.
        }

        if (actionEvent.getSource() == buttons[3]) {
            //Do required tasks.
        }
    }
}