相关疑难解决方法(0)

Java - SwingWorker - 我们可以从其他SwingWorker而不是EDT调用一个SwingWorker

我有SwingWorker如下:

public class MainWorker extends SwingWorker(Void, MyObject) {
    :
    :
}
Run Code Online (Sandbox Code Playgroud)

Swing Worker从EDT 调用了上述内容:

MainWorker mainWorker = new MainWorker();
mainWorker.execute();
Run Code Online (Sandbox Code Playgroud)

现在,mainWorker创建一个MyTask类的10个实例,以便每个实例都在自己的线程上运行,以便更快地完成工作.

但问题是我想在任务运行时不时更新gui.我知道如果任务是由mainWorker自己执行的,我可以使用publish()process()方法来更新gui.

但是由于任务是由与线程不同的Swingworker线程执行的,我如何从执行任务的线程生成的中间结果更新gui.

java user-interface swingworker

3
推荐指数
1
解决办法
3656
查看次数

SwingUtilities.invokeLater和SwingWorker <Void,Object>之间的区别?

有什么区别:

    //Some code, takes a bit of time to process
    (new SomeJFrame()).setVisible(true);

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            (new SomeJWindow()).start();//Start a new thread
        }
    });
Run Code Online (Sandbox Code Playgroud)

和:

    class doGraphics extends SwingWorker<Void, Object> {

        @Override
        public Void doInBackground() {

           //Some code, takes a bit of time to process
            (new SomeJFrame()).setVisible(true);

            return null;
        }

        @Override
        protected void done() {

            (new SomeJWindow()).start();//Start a new thread

        }
    }
    (new doGraphics()).execute();
Run Code Online (Sandbox Code Playgroud)

哪种方法更好用?

java swing multithreading swingworker invokelater

3
推荐指数
1
解决办法
2295
查看次数

事件调度线程的真正"同步"方法

在方法上使用synchronized关键字一次只允许一个线程执行该方法,但EDT可以同时处理将在该方法中运行的多个"事件".请参阅下面的示例代码以进行演示.单击测试按钮时,输出为:

0 before dialog, EDT=true
1 before dialog, EDT=true
(click OK button for 1 here)
1 after dialog, EDT=true
(click OK button for 0 here)
0 after dialog, EDT=true
Run Code Online (Sandbox Code Playgroud)

我正在寻找的方法是一次只允许一个EDT事件在test()方法中处于活动状态,这样输出就会是

0 before dialog, EDT=true
(click OK button for 0 here)
0 after dialog, EDT=true
1 before dialog, EDT=true
(click OK button for 1 here)
1 after dialog, EDT=true
Run Code Online (Sandbox Code Playgroud)

好像有人必须先解决这个问题.我认为可以在方法的开头编写某种锁定对象,或者包装方法,但是懒惰,宁愿不重新发明轮子.

我的测试用例:

package test1;

import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class EDTSyncTest extends javax.swing.JFrame {
  private static final Object …
Run Code Online (Sandbox Code Playgroud)

java swing synchronization

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