label.setVisible(true)在进程完成后才会执行任何操作

时间:2013-02-28 19:07:11

标签: java swing swingworker event-dispatch-thread

我有一个包含几个按钮的对话框。单击某个特定按钮时,它的ActionListener会启动一个需要几秒钟才能完成的过程。在此期间,我想向用户提供一些反馈。采取一种简单的方法,我在“计算...”对话框中有一个标签,该标签最初是不可见的。代码段看起来像这样

button_OpenHoursReport.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        lbl_Computing.setVisible(true);
        new runAndRenderReport();
        RunAndRenderReport.main(null);
        lbl_Computing.setVisible(false);
    }
});

问题是,在RunAndRenderReport完成之前,lbl_Computing文本不可见。显然,这对用户没什么帮助。不知道从哪里开始。这与线程有关吗?如果是这样,我可以就如何开始使用一些指导。

2 个答案:

答案 0 :(得分:5)

actionPerformed()在GUI线程(EDT)上执行,因此请避免对其执行密集操作。而是使用SwingWorker

请参阅How SwingWorker works

答案 1 :(得分:1)

比使用SwingWorker容易得多的技巧是在调用setVisible(true)后调用标签上的paintImmediately。你应该立即看到效果。

lbl_Computing.paintImmediately(0, 0, lbl_Computing.getWidth(), lbl_Computing.getHeight());

但是,如果您希望GUI在报告运行时以其他方式响应,那么SwingWorker就是您的选择。