2016-06-07 20 views
0

我正在用Java構建一個簡單的程序來獲取餘額(我的設置爲$ 8000)。我想存入資金,所以我有一個帶有0-9按鈕,textarea和存款按鈕的UI,因此如果用戶想存入$ 100,他會按1,然後按0兩次。所有的工作,它第一次存款,但第二次存款的雙倍金額。如果我按下存款按鈕10次並選擇$ 1,然後按輸入存入$ 10。我認爲我的btn動作監聽器的結構可能是錯誤的。JButton重複操作取決於按下的次數

任何想法?

代碼:

btnDeposit.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     label1.setText("Deposit: How much would you like to deposit?"); 
     btnWithdraw.setEnabled(false); 
     btnBalance.setEnabled(false); 

     btnEnter.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
       //convert text area into double 
       double depositNumber = Double.parseDouble(ta.getText()); 
       sav.deposit(depositNumber); 
       btnWithdraw.setEnabled(true); 
       btnBalance.setEnabled(true); 
      } 

     }); 

    } 
}); 

我的存款功能是:

public void deposit(double depositAmount) { 
    balance += depositAmount; 
    System.out.println("Your updated balance is: " + balance); 
} 

我也注意到,它不回去的地方,它開始,如果我繼續點擊進入它不斷添加和添加...

按鈕,清除我的文本區域:

btnClear.addActionListener(new new ActionListener(){ 
@Override 
public void actionPerformed(ActionEvent ae) { 
    ta.setText(""); 
} 
}); 
+0

您是否清除文本框? –

+0

是的,如果我存入$ 1,請點擊輸入,然後清除textarea,按1,然後輸入存款,然後存入$ 2!如果我再次這樣做,它會存入$ 3! – Gui

+0

你在哪裏清除它? –

回答

1

該問題在評論部分中提出。您每次執行操作時都會聲明多個偵聽器,這些偵聽器正在調用相應的deposit()withdraw()方法。

爲了避免這種情況。你可以像這樣設置一個監聽器類到你的所有按鈕。

創建一個內部類

private class MySpecialListener implements ActionListener{ 

@Override 
      public void actionPerformed(ActionEvent ae) { 
       if(e.getSource == btnDesposit) // do stuff and so on 
      } 

} 

,並添加監聽器這樣

MySpecialListener myListener = new MySpecialListener(); 
btnDeposit.addActionListener(myListener); 

上述要求你重新寫你的代碼,但它有一個更好的結構,那麼你的目前的一個。 要解決您目前的問題,您可以刪除最後一個聽衆,如下所示:

for(ActionListener al : btnEnter.getActionListeners()) 
btnEnter.removeActionListener(al) 

btnEnter.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent ae) { 
      //convert text area into double 
      double depositNumber = Double.parseDouble(ta.getText()); 
      sav.deposit(depositNumber); 
      btnWithdraw.setEnabled(true); 
      btnBalance.setEnabled(true); 
     } 

    }); 
+0

我沒有得到任何,我不能創建一個私人類,實現動作監聽它說非法開始的表達式...然後我不能從我那裏訪問我的btnDeposit它建議我創建一個局部變量btnDeposit? – Gui

+0

@Gui內部類是你現在的類中。在括號內。聲明和初始化進入你的主類。正如我所說,如果你想使用它,你必須重新編寫你的結構。一個骯髒的修復,沒有在我的底部帖子中。 –

+0

好的,我會根據你的回答與我的老師聯繫,瞭解如何重構我的代碼。快速和骯髒的修復就像一個魅力壽,謝謝! – Gui