4

I have a button doing a long function, I want to disable this button after the user once click on it to in order to prevent him from clicking it again many times

The button gets disabled but the problem is after the function finished the button gets enabled again
i tried to put button.setEnabled(false); in a new thread but it didn't work either

for testing this sample of code

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++) {
                }
            }
        }
    }
});
4

3 回答 3

6

用于SwingWorker长时间运行的后台任务。在这个例子中,startButtonaction 做setEnabled(false)了,worker 的done()实现也做了setEnabled(true)

于 2013-07-23T11:07:20.540 回答
2
  • 包含的所有内容public void actionPerformed(ActionEvent ae) {都是在某一时刻完成的,(在屏幕上)当所有代码行都被执行时,这是 AWT/Swing Listeners 和 EventDispatchThread 的基本规则

  • 您需要通过使用延迟 EDT 中的事件

    1. Swing Timer 的短暂延迟,
    2. 将其余代码(之后button.setEnabled(false);)重定向到SwingWorker,最简单的Runnable#Thread,注意所有输出Runnable#Thread到已经可见的 Swing GUI 必须被包装到invokeLater
  • 正确的方法将仅使用Swing Action而不是仅锁定toJButton设置Action.setEnabled(false)

于 2013-07-23T11:07:57.900 回答
1

编辑:很容易认为您可以使用鼠标侦听器来实现这一点。例如,为了防止您可以使用鼠标释放事件或鼠标侦听器的鼠标单击事件。里面可以写button.setEnable(false)。不幸的是,这也阻塞了事件调度线程

于 2013-07-23T11:00:03.500 回答