从后台线程中的另一个类更新 GUI



我来自.NET环境,即使对于初学者来说,事件侦听也很容易实现。但是这次我必须在Java中执行此操作。

我的伪代码:

主窗体-

public class MainForm extends JFrame {
   ...
   CustomClass current = new CustomClass();       
   Thread t = new Thread(current);
   t.start();
   ...
}

定制类-

public class CustomClass implements Runnable {
   @Override
   public void run()
   {
      //...be able to fire an event that access MainForm
   }
}

找到了这个例子,但在这里我必须监听一个像另一个例子中的事件。我应该把它们混在一起,我在Java方面的技能水平太低了。你能帮我制定一个最佳解决方案吗?

我认为你要找的是SwingWorker。

public class BackgroundThread extends SwingWorker<Integer, String> {
    @Override
    protected Integer doInBackground() throws Exception {
        // background calculation, will run on background thread
        // publish an update
        publish("30% calculated so far");
        // return the result of background task
        return 9;
    }
    @Override
    protected void process(List<String> chunks) { // runs on Event Dispatch Thread
        // if updates are published often, you may get a few of them at once
        // you usually want to display only the latest one:
        System.out.println(chunks.get(chunks.size() - 1));
    }
    @Override
    protected void done() { // runs on Event Dispatch Thread
        try {
            // always call get() in done()
            System.out.println("Answer is: " + get());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

当然,在使用 Swing 时,您希望更新一些 GUI 组件,而不是打印出来。所有 GUI 更新都应在事件调度线程上完成。

如果只想执行某些更新,并且后台任务没有任何结果,则仍应在done()方法中调用get()。如果您不这样做,doInBackground()中抛出的任何异常都将被吞噬 - 很难找出应用程序无法正常工作的原因。

相关内容

  • 没有找到相关文章

最新更新