2015-12-05 13 views
0

我必须创建包含了在一个阵列中创建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)); 
    }.... 

这段代码的问题是,代码复制本身有轻微的变化。我想问一下是否有写这个代码在较短的方式,而不重复一个更好的方法(例如,没有单独的“如果”为每个按钮)。

回答

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)。

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

+0

一个问题:有没有在Java中得到一个数组的元素,并返回该元素的索引此数组中的任何方法? – CrazySynthax

+0

我做了你用getText()写的东西。我得到一个编译错误: “的JButton不能被解析为一个类型为” – CrazySynthax

+0

@CrazySynthax你进口吗?我没有粘贴完整的工作代码,只是替代你的代码。 – user1803551

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

可以在'if'块添加一个'return'的最后一行,以消除不值钱的迭代。 – user1803551