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