相关疑难解决方法(0)

在process()调用完成之前执行SwingWorker,done()

我已经和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)

java swing swingworker

19
推荐指数
1
解决办法
3668
查看次数

Java Swing - 在EDT上运行

关于Swing和使用EDT进行GUI更新,我有几个问题.我刚刚开始阅读这些内容,所以我是这个领域的初学者:

  1. 在EDT上运行需要哪些操作?如果他们不这样做,只是提出一个例外?
  2. 我们实际上在EDT上有没有特定的时间?
  3. 如果我们使用我们安排任务SwingUtilities.invokeLater我们将它排入GUI更新任务的当前队列对吗?
  4. 访问上面的队列我猜是同步的,或者使用了一些并发集合,但是如果我从两个后台线程调度两个GUI更新任务,就不可能说先添加哪一个?例如,如果线程1 FIRST提交将JLable的文本设置为"是"的任务,然后,短时间之后,第二个线程出现并提交将该值设置为"no"的任务,我们是否保证结果将是"是",或者仅仅是操作系统如何安排这些事情的问题?
  5. SwingWorker究竟是如何确保done()在EDT上运行该方法的?它设置以下代码:

      future = new FutureTask<T>(callable) {
                   @Override
                   protected void done() {
                       doneEDT();
                       setState(StateValue.DONE);
                   }
               };
    
    Run Code Online (Sandbox Code Playgroud)

所以我想知道FutureTask是否以某种方式确保invokeLater被调用?

谢谢你的所有答案.

java swing event-dispatch-thread

10
推荐指数
2
解决办法
5564
查看次数

在巨大的数据负载下对JTable行选择事件的延迟响应

我有一个秋千 JTable使用大量数据动态更新 - 不断添加新行,并在几分钟内添加1000-2000行.我已经注册了一个Listener来响应使用的单行选择事件来执行一些工作人员.我已经使用Observer模式进行Swing数据绑定,并且表的模型由WritableList实现支持.因此,新项目将从其自己的Realm添加到表中.并且从SWT UI线程添加了Listener.问题是,当新行添加到表时,它不会立即响应用户行选择事件.只有在停止更新表格模型时,表格才会响应用户选择 - 有时会延迟30-60秒.请帮助我解释为什么我的表模型在深度更新时不会立即响应用户选择,以及如何克服此限制.

java swing

5
推荐指数
1
解决办法
2255
查看次数

标签 统计

java ×3

swing ×3

event-dispatch-thread ×1

swingworker ×1