3

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

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


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

3 回答 3

5

我认为你想要做的是在另一个线程中调用 rest api。您可以使用SwingWorker旨在在另一个线程中运行大量任务而不会阻塞 gui 的设计来完成此操作。这是一个完整的例子,我真的很喜欢Swing Worker Example

例子:

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
   }
}

doInBackground方法完成后,方法done被执行。然后SwingWorker通知任何 PropertyChangeListener 状态属性更改为StateValue.DONE。因此,您可以在此处覆盖此方法或使用 propertyChangeListener 实现来做您想做的事。

于 2013-10-31T14:15:36.933 回答
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);
        }
    });
}
于 2013-10-31T14:07:16.690 回答
0

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

或者您可以尝试使用Executors进行后台进程并从 EDT 更新 UI。

于 2013-10-31T14:13:17.593 回答