如何在使用组件数组时避免重复代码

时间:2015-12-05 00:27:05

标签: java arrays oop

我必须创建一个由10个按钮组成的GUI,这些按钮是在数组中创建的:

    public static final JButton[] buttons = new JButton[10];

每个按钮表示0到9之间的数字。我希望每当我按下按钮时,我所持有的临时值,将乘以10并加到按钮的值上(具有讽刺意味的是,它是'索引)。因此,我写了以下代码:

public void actionPerformed (ActionEvent e) { 

    if (e.getSource()==CalculatorGUI.buttons[0]) { 
        num=num*10;
        CalculatorGUI.resultLabel.setText(Double.toString(num));
    }
    if (e.getSource()==CalculatorGUI.buttons[1]) { 
        num=num*10+1;
        CalculatorGUI.resultLabel.setText(Double.toString(num));
    }
    if (e.getSource()==CalculatorGUI.buttons[2]) { 
        num=num*10+2;
        CalculatorGUI.resultLabel.setText(Double.toString(num));
    }
    if (e.getSource()==CalculatorGUI.buttons[3]) { 
        num=num*10+3;
        CalculatorGUI.resultLabel.setText(Double.toString(num));
    }
    if (e.getSource()==CalculatorGUI.buttons[4]) { 
        num=num*10+4;
        CalculatorGUI.resultLabel.setText(Double.toString(num));
    }....

此代码的问题在于代码重复了一些微小的更改。我想问一下是否有更好的方法可以在没有重复的情况下以更短的方式编写此代码(例如,没有单独的"如果"对于每个按钮)。

2 个答案:

答案 0 :(得分:0)

如果您的代码适合您,您可以减少它:

public void actionPerformed (ActionEvent e) { 
    for(int i = 0; i < CalculatorGUI.buttons.length; i++){
        if (e.getSource()==CalculatorGUI.buttons[i]) { 
            num=num*10 + i;
            CalculatorGUI.resultLabel.setText(Double.toString(num));
            return; //or break;
        }
    }
}

答案 1 :(得分:0)

你可以选择更强大的东西:

public class Example {

    public static final JButton[] BUTTONS = new JButton[10];

    public static void main(String[] args) {

        for (int i = 0; i < BUTTONS.length; i++) {
            // initialize BUTTONS[i]
            BUTTONS[i].addActionListener(new MyActionListener(i));
        }
    }

    private static class MyActionListener implements ActionListener {

        int i;

        MyActionListener(int i) {

            this.i = i;
        }

        @Override
        public void actionPerformed(ActionEvent e) {

            num = num * 10 + i;
            CalculatorGUI.resultLabel.setText(Double.toString(num));
        }
    }
}

这样您就不需要检查源组件是什么了。

或者,您可以依赖源组件:

public class Example {

    public static final JButton[] BUTTONS = new JButton[10];

    public static void main(String[] args) {

        for (int i = 0; i < BUTTONS.length; i++) {
            // initialize BUTTONS[i]
            BUTTONS[i].setText(String.valueOf(i));
            BUTTONS[i].addActionListener(new MyActionListener());
        }
    }

    private static class MyActionListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {

            int i = Integer.parseInt(((JButton) e.getSource()).getText());
            num = num * 10 + i;
            CalculatorGUI.resultLabel.setText(Double.toString(num));
        }
    }
}

或者使用任何方式识别它是哪个按钮而不迭代所有按钮(例如使用putClientPropertygetClientProperty)。

此外,根据Java命名约定,final变量应为大写。