JButton 重复动作取决于按下的次数
JButton repeating action depending on how many times pressed
我正在 Java 中构建一个简单的程序来获得余额(我的设置为 8000 美元)。我想把钱存进去,所以我有一个 UI 和 0-9 按钮,一个文本区域和一个存款按钮,所以如果用户想存入 100 美元,他会按 1 一次,然后按 0 两次。一切正常,它第一次存入,但第二次存入双倍的钱。如果我按我的存款按钮 10 次,然后 select $1 然后按回车键,它会存入 $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("");
}
});
问题在评论区喊出来。您正在声明多个侦听器,它们在每次执行操作时调用相应的 deposit()
或 withdraw()
方法。
为了避免这种情况。您可以像这样为所有按钮设置一个监听器 class。
创建内部class
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);
}
});
我正在 Java 中构建一个简单的程序来获得余额(我的设置为 8000 美元)。我想把钱存进去,所以我有一个 UI 和 0-9 按钮,一个文本区域和一个存款按钮,所以如果用户想存入 100 美元,他会按 1 一次,然后按 0 两次。一切正常,它第一次存入,但第二次存入双倍的钱。如果我按我的存款按钮 10 次,然后 select $1 然后按回车键,它会存入 $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("");
}
});
问题在评论区喊出来。您正在声明多个侦听器,它们在每次执行操作时调用相应的 deposit()
或 withdraw()
方法。
为了避免这种情况。您可以像这样为所有按钮设置一个监听器 class。
创建内部class
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);
}
});