代码之家  ›  专栏  ›  技术社区  ›  Amit

我们可以从其他子面板中调用一个子图,而不是用

  •  3
  • Amit  · 技术社区  · 15 年前

    我有一个 SwingWorker 具体如下:

    public class MainWorker extends SwingWorker(Void, MyObject) {
        :
        :
    }
    

    我援引了上面的话 Swing Worker 从EDT:

    MainWorker mainWorker = new MainWorker();
    mainWorker.execute();
    

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

    但问题是我想在任务运行时不时更新gui。我知道如果任务是由 主要工人 本身,我可以用 publish() process() 方法来更新gui。

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

    4 回复  |  直到 15 年前
        1
  •  8
  •   Noel Ang    15 年前

    swingworker的api文档提供了以下提示:

    doinBackground()方法被调用 在这条线上。在这里 应进行背景活动。 通知PropertyChangeListeners 关于绑定属性更改使用 防火性能改变和 getpropertychangesupport()方法。通过 默认情况下有两个绑定属性 可用:状态和进度。

    MainWorker 可以实现 PropertyChangeListener . 然后它就可以在 PropertyChangeSupport :

    getPropertyChangeSupport().addPropertyChangeListener( this );
    

    主要工人 可以提供其 属性更改支持 反对 MyTask 它创建的对象。

    new MyTask( ..., this.getPropertyChangeSupport() );
    

    任务管理系统 对象可以通知其 主要工人 通过使用 PropertyChangeSupport.firePropertyChange 方法。

    主要工人 ,因此通知,然后可以使用 SwingUtilities.invokeLater SwingUtilities.invokeAndWait 通过edt更新swing组件。

    protected Void doInBackground() {
        final int TASK_COUNT = 10;
        getPropertyChangeSupport().addPropertyChangeListener(this);
        CountDownLatch latch = new CountDownLatch( TASK_COUNT ); // java.util.concurrent
        Collection<Thread> threads = new HashSet<Thread>();
        for (int i = 0; i < TASK_COUNT; i++) {
            MyTask task = new MyTask( ..., latch, this.getPropertyChangeSupport() ) );
            threads.add( new Thread( task ) );
        }
        for (Thread thread: threads) {
            thread.start();
        }
        latch.await();
        return null;
    }
    
        2
  •  3
  •   Matthieu BROUILLARD    15 年前

    即使不使用swingworker,也可以使用swingutilities.invokelater(…)或swingutilities.invokeandwait(…)在edt中发布要做的事情。

    编辑: 假设您有一个线程正在执行一些代码,那么您始终可以像下面的示例中那样与edt交互。

    public void aMethodExecutedInAThread() {
    
        // Do some computation, calculation in a separated Thread
    
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                // Post information in the EDT
                // This code is executed inside EDT
            }
        });
    }
    
        3
  •  2
  •   trashgod    15 年前

    这是一个 example 使用 SwingWorker 启动多个线程。一 CountDownLatch 确保 doInBackground() 仅当所有线程都已完成时返回。每个线程使用线程安全 append() 方法 JTextArea 更新gui,但是 EventQueue.invokeLater() 会是个方便的选择。

        4
  •  0
  •   rgksugan    15 年前