我正在用Java构建一个简单的程序来获得平衡(我的设置为8000美元)。我想把钱存入,所以我有一个带有0-9按钮的UI,一个textarea和一个存款按钮,所以如果用户想要存入100美元,他会按1然后按0两次。一切正常,它第一次存款,但第二次存入双倍金额。如果我按下我的存款按钮10次并选择1美元然后按Enter键存入10美元。我认为我的btn动作监听器的结构可能是错误的。
有什么想法吗?
代码:
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);
}
我也注意到它不会回到它开始的地方,如果我一直点击Enter它会继续添加和添加......
清除文字区域的按钮:
btnClear.addActionListener(new new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae) {
ta.setText("");
}
});
答案 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);
}
});