2013-07-13 75 views
0

爲了達到這個目的,我無法通過外部ActionListener類來編寫靜態雙精度值或JTextField。 我正在製作一個高級計算器,爲了讓事情變得更容易,我正在嘗試創建GUI,實現其按鈕和其他功能,並且我正在嘗試將ActionListeners放在其他類中。在eclipse中,它表示我需要讓計算器的靜態變量靜態,但使它們變爲靜態,我不能再寫入它們,並顯示答案。 這是代碼我有:Java ActionListener類不寫入靜態變量

public static JButton num0, num1, num2, num3, num4, num5, num6, num7, num8, num9; 
public static double tempNum1; 
public static double tempNum2; 
public static boolean pointOn = false; 
public static int APC = 1; 

public GUI(){ 
    GUINumListener numListener = new GUINumListener(); 

    num0.addActionListener(numListener); 
    num1.addActionListener(numListener); 
    num2.addActionListener(numListener); 
    num3.addActionListener(numListener); 
    num4.addActionListener(numListener); 
    num5.addActionListener(numListener); 
    num6.addActionListener(numListener); 
    num7.addActionListener(numListener); 
    num8.addActionListener(numListener); 
    num9.addActionListener(numListener); 
} 

並在GUINumListener類:

public class GUINumListener implements ActionListener{ 
    public void actionPerformed(ActionEvent e){ 
     if (e.getActionCommand().equals(GUI.num0)){ 
      GUI.tempNum2 *= 10; 
     }else if (e.getActionCommand().equals(GUI.num1)){ 
      if (GUI.pointOn = false){ 
       GUI.tempNum2 = (GUI.tempNum2 * 10) + 1; 
      }else{ 
       GUI.tempNum2 = (GUI.tempNum2 * Math.pow(10, GUI.APC) + 1)/Math.pow(10, GUI.APC); 
       GUI.APC++; 
      } 
      GUI.ansField.setText(Double.toString(GUI.tempNum2)); 
     } 
    } 

點擊程序中的數不輸出它在ansField字段。 幫助! 感謝

+4

不要讓他們一成不變的。 Eclipse只是抱怨,因爲代碼沒有編譯,並且提出了一個解決方案來編譯它。但是編譯代碼並不能使它正確和清晰。可寫入的靜態變量是99.9%的次數,是一種設計氣味。哦,田野也不應該公開。使它們成爲私有的,或者至少是包私有的。 –

+2

我第二次都是由@JBNizet指出的。並且瞭解並使用數組或集合。如果做得好,它可以使你的代碼更短,更容易調試和維護。 –

回答

1

不要使用靜態字段,並封裝它們。

對於ActionListener如果唯一的範圍是外部類或Anoymous Classes,我總是使用內部私有類。

此外,它似乎你有一個按鈕的集合,你可以考慮分組收集。

實例(我在代碼註釋):

private List<JButton> buttons; 
private double tempNum1; 
private double tempNum2; 
private boolean pointOn = false; 
private int APC = 1; 
//make them private why public and static? 


public GUI(){ 
    ActionListener numListener = new GUINumListener(); 

    //initiliatze buttons 

    int size=10; 
    buttons= new ArrayList<>(size); 

    for(int i=0;i<size;i++){ 
     JButton button = new JButton(); 
     button.addActionListener(numListener); 
     buttons.add(button);    
    } 

} 


private class GUINumListener implements ActionListener{ 
@Override 
public void actionPerformed(ActionEvent e){ 
     if (e.getSource() == buttons.get(0)){ // actionCommand returns string you have to use getSource() or setting an actionCommand to the button and compare num0.getActionCommand() 
      tempNum2 *= 10; 
     }else if (e.getSource() == buttons.get(1)){ 
      if (!pointOn){ // u were assigning pointOn = false 
       tempNum2 = (tempNum2 * 10) + 1; 
      }else{ 
       tempNum2 = (tempNum2 * Math.pow(10, APC) + 1)/Math.pow(10, APC); 
       APC++; 
      } 
      ansField.setText(Double.toString(tempNum2)); 
     } 

} 
+0

即使'GUINumListener'成爲內部類。 – kuporific

+0

@kuporific我在編輯你的評論xD – nachokk

+0

我覺得你到了那裏;)這是問題的適當解決方案。 – kuporific

1

的問題是你的if檢查:e.getActionCommand().equals(GUI.num0)

getActionCommand()返回Stringnum0JButton。因此,equals將始終返回false,因爲它們不是相同的類類型。要解決這個

一種方法是檢查按鈕的標籤:getActionCommand()

所以if的說法應該是:

e.getActionCommand().equals(GUI.num0.getActionCommand())