【问题标题】:JButton repeating action depending on how many times pressedJButton根据按下的次数重复动作
【发布时间】:2016-06-07 11:49:56
【问题描述】:

我正在用 Java 构建一个简单的程序来获得平衡(我的设置为 8000 美元)。我想把钱存进去,所以我有一个带有 0-9 按钮、一个文本区域和一个存款按钮的 UI,所以如果用户想存 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,点击进入,然后清除textarea,按1,去存入然后进入,它存入$2!如果我再次这样做,它将存入 3 美元!
  • 你在哪里清除它?
  • 我有一个清除按钮,将我的 textarea 设置为“”,我正在编辑上面的代码并添加该位。谢谢
  • 我建议您将btnEnter.addActionListener... 移出btnDeposit.addActionListener...。我猜它每次都会添加一个新的 actionlistener,所以在第二次尝试中,你有 2 个 btnDeposit 的监听器,它们添加了两次钱。

标签: java jbutton


【解决方案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);
        }

    });

【讨论】:

  • 我什么也不懂,我无法创建一个私有类来实现 Actions 监听器,它说表达式的非法开始...然后我无法从里面访问我的 btnDeposit建议我创建一个局部变量 btnDeposit?
  • @Gui 内部类在您当前的类中。括号内。它的声明和初始化进入你的主类。正如我所说,如果你想使用它,你必须重新编写你的结构。一个快速的肮脏修复,没有我底部帖子中的所有内容。
  • 是的,好的,我将与我的老师联系,了解如何根据您的回答重新构建我的代码。快速而肮脏的修复就像一个魅力,谢谢!
猜你喜欢
  • 2023-03-28
  • 2014-09-20
  • 2017-06-11
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
相关资源
最近更新 更多