0

MVC を使用して基本的な電卓を作成しています。これまでのところ、ユーザーが入力した 2 つの値を合計するだけのチュートリアルを採用しています。

現在、ビューに追加している各ボタンには独自のリスナーがありますが、これで問題ありません。ただし、チュートリアルのコントローラーには、ボタンごとに 1 つの 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");              
        }           
    }
}
4

2 に答える 2

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維持が困難になる可能性のあるモンスターステートメントを作成できることです。

私の考えでは、一連のヘルパー メソッド (など) を含むある種のモデル/ビルダーを作成し、各ボタンの個々のアクションに Actions API を使用add(Number)ます...しかし、それは私だけです...subtract(Number)

于 2013-06-09T08:32:13.253 に答える
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.
        }
    }
}
于 2013-06-09T18:25:33.003 に答える