Java中的GUI控制流和回调

时间:2016-06-08 16:35:20

标签: java user-interface

我的背景主要是在JavaScript中,其中函数是一流的对象,我可以轻松地将它们作为回调传递给它们。这就是JavaScript的方式

现在我正在尝试构建一个简单的Java应用程序。手头的问题是(1)使用Swing让用户浏览到要打开的文件,然后(2)用它做一些事情。让我们说我有这样的方法

void doStuff(File file) {
    //stuff
}

需要在用户选择的文件上运行。在JavaScript中,doStuff函数只是作为回调传递。如何用Java做到这一点?

我意识到可以通过使用void run()方法创建一个Callback接口来在Java中进行回调。但这是惯用的吗?如何应该这样做?经验丰富的Java程序员如何选择这样做?

另外,当我使用回调时,看起来几乎所有事情都发生在Event Dispatch Thread上。我想我可以从EDT创建一个新的第三个线程,但似乎我的doStuff函数应该在主线程上执行。我无法找到实现这一目标的任何方法。我也不知道实现它是否必要或可取。

1 个答案:

答案 0 :(得分:1)

  

简单地说,"做东西"将从文件中解析和导入数据。

由于这涉及文件或资源输入,因此不应在EDT上完成。 IMO的最佳解决方案是

  • 在SwingWorker的doInBackground()方法中进行导入和解析
  • 将一个PropertyChangeListener添加到SwingWorker
  • 让此侦听器侦听worker的state属性,特别是对于SwingWorker.StateValue.DONE的新值
  • 在此监听器中,您将在工作人员完成其任务时收到通知。您希望确保在完成后在SwingWorker上调用get(),这样您就可以获得希望它生成的任何结束值,这样您就可以捕获并响应任何和所有异常可能在其运行期间发生过。

有关详情,请查看教程 - Lesson: Concurrency in Swing

  

您是否建议主要使用SwingWorker,以便此过程不会在EDT上进行,从而锁定用户界面?

是。任何线程都可以达到这个目的,但使用SwingWorker的主要优点是因为虽然它将在后台线程中运行该进程,但它也有很好的机制来提供结束和中间结果 on EDT ,以及监控进度的内置功能。