在actionPerformed完成java之前单击禁用按钮

时间:2013-07-23 10:40:29

标签: java swing jbutton actionlistener event-dispatch-thread

我有一个执行长功能的按钮,我想在用户点击它之后禁用此按钮,以防止他再次点击它

按钮被禁用但问题是在功能完成后再次启用按钮
我试图把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++) {
                }
            }
        }
    }
});

3 个答案:

答案 0 :(得分:6)

使用SwingWorker进行长时间运行的后台任务。在此example中,startButton操作执行setEnabled(false),而工作人员的done()实施执行setEnabled(true)

答案 1 :(得分: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中{1}}
  • 适当的方法仅使用Swing Action,而不是仅锁定JButton以设置Action.setEnabled(false)

答案 2 :(得分:1)

编辑:认为你可以使用鼠标监听器来实现这一点很诱人。例如,为了防止您使用鼠标监听器的鼠标释放事件或鼠标单击事件。在里面你可以写button.setEnable(false)。不幸的是,这也阻止了event dispatch thread