在我的下面的代码中,我希望在应用程序加载数据时清除TextArea。我还添加了一个重绘()但仍然没有清除。 我是否必须以不同方式通知它以强制重新粉刷?
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
textArea.setText("");
textArea.repaint();
String result = //call a REST API
textArea.setText(result);
}
});
答案 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)
您在EDT中运行actionPerformed(ActionEvent event)
方法,因为您无法更新UI。要从代码更新UI,请尝试使用SwingWorker,它可以在后台进程运行时更新UI。
或者您可以尝试使用Executors进行后台处理并从EDT更新用户界面。