Java 如何为多个JButton创建一个ActionListener

Java 如何为多个JButton创建一个ActionListener,java,swing,jbutton,actionlistener,Java,Swing,Jbutton,Actionlistener,我正在使用MVC创建一个基本计算器。到目前为止,我正在修改一个教程,它只将两个用户输入的值相加 目前,我添加到视图中的每个按钮都有自己的侦听器,这是正常的。但是,教程中的控制器每个按钮都有一个ActionListener内部类。这会重复大量代码 如何为所有按下的按钮创建一个ActionListener类,并对按下的按钮id使用case语句 在视图中注册oneButton void oneListener(ActionListener listenForOneButton){ on

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

目前,我添加到视图中的每个按钮都有自己的侦听器,这是正常的。但是,教程中的控制器每个按钮都有一个ActionListener内部类。这会重复大量代码

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

在视图中注册oneButton

void oneListener(ActionListener listenForOneButton){    
    oneButton.addActionListener(listenForOneButton);
}    
为控制器内部类中的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");              
        }           
    }
}

从实现
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 ...

    }
}
CalculatorHandler handler = new CalculatorHandler();
JButton plus = new JButton("+");
plus.setActionCommand(CalculatorHandler.ADD_ACTION_COMMAND);
plus.addActionListener(handler);
最好定义该类可以处理的操作命令是常量,从而消除任何歧义

接下来,在包含按钮的类中,创建
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 ...

    }
}
CalculatorHandler handler = new CalculatorHandler();
JButton plus = new JButton("+");
plus.setActionCommand(CalculatorHandler.ADD_ACTION_COMMAND);
plus.addActionListener(handler);
然后按照常规创建按钮并注册
处理程序

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 ...

    }
}
CalculatorHandler handler = new CalculatorHandler();
JButton plus = new JButton("+");
plus.setActionCommand(CalculatorHandler.ADD_ACTION_COMMAND);
plus.addActionListener(handler);
IMHO这种方法唯一的问题是,它可以创建一个怪物
if-else
语句,这可能会变得难以维护


在我看来,我会创建某种模型/构建器,其中包含一系列辅助方法(如
add(Number)
subtract(Number)
等),并用于每个按钮的单独操作…但这只是我…

从实现
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 ...

    }
}
CalculatorHandler handler = new CalculatorHandler();
JButton plus = new JButton("+");
plus.setActionCommand(CalculatorHandler.ADD_ACTION_COMMAND);
plus.addActionListener(handler);
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.
        }
    }
}
最好定义该类可以处理的操作命令是常量,从而消除任何歧义

接下来,在包含按钮的类中,创建
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 ...

    }
}
CalculatorHandler handler = new CalculatorHandler();
JButton plus = new JButton("+");
plus.setActionCommand(CalculatorHandler.ADD_ACTION_COMMAND);
plus.addActionListener(handler);
然后按照常规创建按钮并注册
处理程序

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 ...

    }
}
CalculatorHandler handler = new CalculatorHandler();
JButton plus = new JButton("+");
plus.setActionCommand(CalculatorHandler.ADD_ACTION_COMMAND);
plus.addActionListener(handler);
IMHO这种方法唯一的问题是,它可以创建一个怪物
if-else
语句,这可能会变得难以维护

在我看来,我会创建某种模型/构建器,其中包含一系列辅助方法(如
add(Number)
subtract(Number)
等),并用于每个按钮的单独操作…但这只是我…

公共类SingleActionListener实现ActionListener{
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.
        }
    }
}
public void initializeButtons(){ JButton[]按钮=新JButton[4]; 字符串[]buttonNames=新字符串[]{“button1”、“button2”、“button3”、“button4”}; 对于(int i=0;i<4;i++){ 按钮[i]=新的JButton(按钮名称[i]); } } public void addActionListenersToButtons(){ 对于(int i=0;i<4;i++){ 按钮[i].addActionListener(此); } } 公共无效ActionPerformed(ActionEvent ActionEvent){ if(actionEvent.getSource()==按钮[0]){ //完成要求的任务。 } if(actionEvent.getSource()==按钮[1]){ //完成要求的任务。 } if(actionEvent.getSource()==按钮[2]){ //完成要求的任务。 } if(actionEvent.getSource()==按钮[3]){ //完成要求的任务。 } } }
公共类SingleActionListener实现ActionListener{
public void initializeButtons(){
JButton[]按钮=新JButton[4];
字符串[]buttonNames=新字符串[]{“button1”、“button2”、“button3”、“button4”};
对于(int i=0;i<4;i++){
按钮[i]=新的JButton(按钮名称[i]);
}
}
public void addActionListenersToButtons(){
对于(int i=0;i<4;i++){
按钮[i].addActionListener(此);
}
}
公共无效ActionPerformed(ActionEvent ActionEvent){
if(actionEvent.getSource()==按钮[0]){
//完成要求的任务。
}
if(actionEvent.getSource()==按钮[1]){
//完成要求的任务。
}
if(actionEvent.getSource()==按钮[2]){
//完成要求的任务。
}
if(actionEvent.getSource()==按钮[3]){
//完成要求的任务。
}
}
}

+1表示
操作
;参见
DefaultEditorKit
StyledEditorKit
作为示例。
操作+1;请参见
DefaultEditorKit
StyledEditorKit
作为示例。