JButton重复操作取决于按下的次数

时间:2016-06-07 11:49:56

标签: java jbutton

我正在用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("");
}
});

1 个答案:

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

    });