2015-12-05 17 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