我有一个执行长功能的按钮,我想在用户点击它之后禁用此按钮,以防止他再次点击它
按钮被禁用但问题是在功能完成后再次启用按钮
我试图把button.setEnabled(false);
放在一个新的线程中,但它不起作用
用于测试此代码示例
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
button.setEnabled(false);
for (int i = 0; i < Integer.MAX_VALUE; i++) {
for (int j = 0; j < Integer.MAX_VALUE; j++) {
for (int ii = 0; ii < Integer.MAX_VALUE; ii++) {
}
}
}
}
});
答案 0 :(得分:6)
使用SwingWorker
进行长时间运行的后台任务。在此example中,startButton
操作执行setEnabled(false)
,而工作人员的done()
实施执行setEnabled(true)
。
答案 1 :(得分:2)
public void actionPerformed(ActionEvent ae) {
中包含的所有内容都会在执行所有代码行时(屏幕上)完成,这是AWT / Swing Listeners和EventDispatchThread的基本规则
您需要使用
延迟EDT中的事件button.setEnabled(false);
之后)重定向到SwingWorker
,最简单到Runnable#Thread
,请注意Runnable#Thread
到已经可见的Swing GUI的所有输出都必须包含在invokeLater
中{1}} 适当的方法仅使用Swing Action
,而不是仅锁定JButton
以设置Action.setEnabled(false)
答案 2 :(得分:1)
编辑:认为你可以使用鼠标监听器来实现这一点很诱人。例如,为了防止您使用鼠标监听器的鼠标释放事件或鼠标单击事件。在里面你可以写button.setEnable(false)
。不幸的是,这也阻止了event dispatch thread。