如何在ActionListener正在进行时更新swing UI

时间:2013-10-31 14:02:41

标签: java swing

在我的下面的代码中,我希望在应用程序加载数据时清除TextArea。我还添加了一个重绘()但仍然没有清除。 我是否必须以不同方式通知它以强制重新粉刷?

    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            textArea.setText("");
            textArea.repaint();


            String result = //call a REST API
            textArea.setText(result);
        }
    });

3 个答案:

答案 0 :(得分:5)

我认为你想做的是在另一个线程中调用其余的api。您可以使用SwingWorker来完成此操作,该class Worker extends SwingWorker<Void, String> { @Override     protected Void doInBackground() throws Exception { //here you make heavy task this is running in another thread not in EDT // call REST API here return null;     }    @Override    protected void done() {         //this is executed in the EDT //here you update your textArea with the result    } } 旨在在另一个线程中运行大量任务而不会阻止gui。这是一个我非常喜欢Swing Worker Example

的完整示例

示例:

doInBackground

done方法完成后,执行SwingWorker方法。然后StateValue.DONE通知任何PropertyChangeListeners状态属性更改为{{1}}。因此,您可以在此处覆盖此方法,或使用propertyChangeListener实现来执行您想要的操作。

答案 1 :(得分:1)

在另一个线程中执行耗时的操作。您可以使用SwingWorker,它将在计算完成后立即通知AWT线程。

public void actionPerformed(ActionEvent event) {
    textArea.setText("");

    SwingWorker<String, Object> worker = new SwingWorker<String, Object>() {
        @Override
        protected String doInBackground() throws Exception {                
            return ...; // call a REST API
        }
        @Override
        protected void done() {
            try {
                textArea.setText(get());
            } catch (Exception e) {
                //ignore
            }
        }
    };      
    worker.execute();
}

您还可以使用invokeLater,它将作为事件队列的一部分执行REST调用。

public void actionPerformed(ActionEvent event) {
    textArea.setText("");

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            String result = // call a REST API
            textArea.setText(result);
        }
    });
}

答案 2 :(得分:0)

您在ED​​T中运行actionPerformed(ActionEvent event)方法,因为您无法更新UI。要从代码更新UI,请尝试使用SwingWorker,它可以在后台进程运行时更新UI。

或者您可以尝试使用Executors进行后台处理并从EDT更新用户界面。