我已经和SwingWorker一起工作了一段时间并且最终出现了一种奇怪的行为,至少对我而言.我清楚地了解到,由于性能原因,一次调用中对publish()方法的几次调用是有用的.这对我来说非常有意义,我怀疑SwingWorker会保留某种队列来处理所有调用.
根据教程和API,当SwingWorker结束执行时,doInBackground()正常完成或工作线程从外部取消,然后调用done()方法.到现在为止还挺好.
但是我有一个示例(类似于教程中所示),其中在执行process()方法之后 done()执行了方法调用.由于两个方法都在Event Dispatch Thread中执行,因此我希望done()在所有process()调用完成后执行.换一种说法:
Writing...
Writing...
Stopped!
Run Code Online (Sandbox Code Playgroud)
Writing...
Stopped!
Writing...
Run Code Online (Sandbox Code Playgroud)
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class Demo {
private SwingWorker<Void, String> worker;
private JTextArea textArea;
private Action startAction, stopAction;
private void …Run Code Online (Sandbox Code Playgroud) 关于Swing和使用EDT进行GUI更新,我有几个问题.我刚刚开始阅读这些内容,所以我是这个领域的初学者:
SwingUtilities.invokeLater我们将它排入GUI更新任务的当前队列对吗?SwingWorker究竟是如何确保done()在EDT上运行该方法的?它设置以下代码:
future = new FutureTask<T>(callable) {
@Override
protected void done() {
doneEDT();
setState(StateValue.DONE);
}
};
Run Code Online (Sandbox Code Playgroud)所以我想知道FutureTask是否以某种方式确保invokeLater被调用?
谢谢你的所有答案.
我有一个秋千 JTable使用大量数据动态更新 - 不断添加新行,并在几分钟内添加1000-2000行.我已经注册了一个Listener来响应使用的单行选择事件来执行一些工作人员.我已经使用Observer模式进行Swing数据绑定,并且表的模型由WritableList实现支持.因此,新项目将从其自己的Realm添加到表中.并且从SWT UI线程添加了Listener.问题是,当新行添加到表时,它不会立即响应用户行选择事件.只有在停止更新表格模型时,表格才会响应用户选择 - 有时会延迟30-60秒.请帮助我解释为什么我的表模型在深度更新时不会立即响应用户选择,以及如何克服此限制.