gpt4 book ai didi

java - Java 中的 GUI 控制流和回调

转载 作者:行者123 更新时间:2023-12-01 09:49:20 25 4
gpt4 key购买 nike

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

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

void doStuff(File file) {
//stuff
}

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

我知道可以通过使用 void run() 方法创建回调接口(interface)来在 Java 中执行回调。但这是惯用语吗?这种事情应该怎么做?经验丰富的 Java 程序员会如何选择?

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

最佳答案

Put simply, "do stuff" will parse and import data from the file.

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

  • 在 SwingWorker 的 doInBackground() 方法中进行导入和解析
  • 向 SwingWorker 添加 PropertyChangeListener
  • 让此监听器监听工作线程的状态属性,特别是 SwingWorker.StateValue.DONE 的新值
  • 在此监听器中,当工作人员完成其任务时,您将收到通知。您需要确保在 SwingWorker 完成时调用 get() ,这样您就可以获得您希望它产生的任何最终值,这样您就可以捕获并响应任何和运行期间可能发生的所有异常。

有关此内容的更多信息,请查看教程 -- Lesson: Concurrency in Swing

<小时/>

Do you suggest using SwingWorker mainly so that this process doesn't take place on the EDT, thereby locking up the user interface?

是的。不过,任何线程都可以实现此目的,但使用 SwingWorker 的主要优点是,虽然它将在后台线程中运行该进程,但它还具有在 EDT 上提供最终和中期结果的出色机制以及监控进度的内置功能。

关于java - Java 中的 GUI 控制流和回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37708176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com