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);
        }

    });