Java JButton can';不能正确地禁用

Java JButton can';不能正确地禁用,java,swing,Java,Swing,当触发事件时,程序应在执行某些进程时禁用按钮,并且在进程结束后,程序应做的最后一件事是重新启用按钮 不幸的是,实际发生的情况是,在进程执行期间,按钮不会被禁用。当我删除了最后一行,这是应该重新启用按钮,我注意到,第一行,这是打算禁用按钮的开始,实际上是执行后的进程结束 这意味着两个convertBtn.setEnabled(假);和convertBtn.setEnabled(true);似乎在其他进程结束后执行 Swing使用单个线程进行所有事件调度。这还包括绘制事件 基本上,在您的代码中,Ac

当触发事件时,程序应在执行某些进程时禁用按钮,并且在进程结束后,程序应做的最后一件事是重新启用按钮

不幸的是,实际发生的情况是,在进程执行期间,按钮不会被禁用。当我删除了最后一行,这是应该重新启用按钮,我注意到,第一行,这是打算禁用按钮的开始,实际上是执行后的进程结束


这意味着两个convertBtn.setEnabled(假);和convertBtn.setEnabled(true);似乎在其他进程结束后执行

Swing使用单个线程进行所有事件调度。这还包括绘制事件

基本上,在您的代码中,
ActionEvent
被传递到您的
actionPerformed
方法,您执行一些工作(禁用/启用按钮),然后该方法返回。只有在这一点上,Swing才有可能处理任何新事件(包括重新绘制事件)

这意味着,在
actionPerformed
存在之前,UI上的任何内容都不会更新

有关更多详细信息,请参阅

那么,解决方案是什么

嗯,最常见的解决方案是使用

这将允许您在事件调度线程之外执行工作,但也为与UI交互提供了方便的功能,如更新进度条


您还可以监听worker以查看它何时完成并重置按钮的状态,Swing使用单个线程进行所有事件调度。这还包括绘制事件

基本上,在您的代码中,
ActionEvent
被传递到您的
actionPerformed
方法,您执行一些工作(禁用/启用按钮),然后该方法返回。只有在这一点上,Swing才有可能处理任何新事件(包括重新绘制事件)

这意味着,在
actionPerformed
存在之前,UI上的任何内容都不会更新

有关更多详细信息,请参阅

那么,解决方案是什么

嗯,最常见的解决方案是使用

这将允许您在事件调度线程之外执行工作,但也为与UI交互提供了方便的功能,如更新进度条


您还可以收听worker查看何时完成并重置按钮的状态

@shb2789作为此答案的补充,我建议@shb2789作为此答案的补充,我建议
//Click Event for convertBtn
        convertBtn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                //Disable convertBtn temporarily
                convertBtn.setEnabled(false);

                //If amountBox is empty or has an invalid value
                if(!amountBox.getText().matches("^[0-9]{0,10}(\\.[0-9]{1,5})?$") || amountBox.getText().equalsIgnoreCase("")) {
                    amountBox.requestFocusInWindow();
                    JOptionPane.showMessageDialog (null, "Please Enter a valid amount.\nEx: 1234567890.12345", "Invalid Amount", JOptionPane.ERROR_MESSAGE);
                    convertBtn.setEnabled(true);
                    return;
                }

                //Fetch the exchange rate and place it inside the resLabel.
                //The code connect to a server to fetch the data with the help of a thread.
                //Also Thread.join() is used in the code to wait for the result.
                ExchangeRate er = new ExchangeRate(currencies[fromCombo.getSelectedIndex()], currencies[toCombo.getSelectedIndex()], amountBox.getText());
                resLabel.setText(er.getExhangeRate());

                //Re-enable convertBtn
                convertBtn.setEnabled(true);

            }

        });