gpt4 book ai didi

java - JavaFX 中的 SecondaryLoop,如 Swing?

转载 作者:搜寻专家 更新时间:2023-10-31 20:27:20 26 4
gpt4 key购买 nike

我有一个 Java Swing 应用程序,我正在研究它是否有可能移植到 JavaFX。该应用程序是内部使用的脚本语言的开发环境和模拟器。有趣的是,您可以为这种脚本语言设置断点并逐步执行它,就像任何程序员对语言的期望一样。

现在因为模拟器中的语言是解释性的,在解释器的执行深处,当它遇到断点时,它可以使用 Java Swing SecondaryLoop 类弹出回到 gui。所以当遇到断点时,它会调用 secondaryLoop.enter()。然后 gui 处于 Activity 状态,供用户检查变量并且 gui 组件处于 Activity 状态。当用户在程序中点击“继续”时,它会调用 secondaryLoop.exit() 以继续执行解释器。解释器解除它的整个状态以返回到主循环,然后在完全相同的位置从它停止的地方开始,这实际上是不可行的。这就是为什么 SecondaryLoop 在使其发挥作用方面具有无可估量的值(value)。

这在 JavaFX 中可行吗?

最佳答案

是的,这是可能的。您需要使用 enterNestedEventLoopexitNestedEventLoop 方法(它们位于 com.sun.javafx.tk.Toolkit 类中)。请参阅此用法示例:

// Make sure to import the FX Toolkit first
import com.sun.javafx.tk.Toolkit;

// This object will be used as a unique identifier to the nested loop (to
// block the execution of the thread until exitNestedEventLoop is called)
final Object loopLock = new Object();

// Simulate a long process thread (DB call, download, etc)
Thread longProcess = new Thread(new Runnable()
{
@Override
public void run()
{
// Sleep for 12 seconds to simulate a long process
try
{
Thread.sleep(12000);
} catch (InterruptedException e)
{
e.printStackTrace();
}

// Setup a result to pass back to the enterNestedLoop() caller
String result = "Result of this long process";

// We are now done. Call exitNestedEventLoop() to unblock
// the enterNestedLoop() caller. This needs to run from
// the FX Thread so use Platform.runLater()
Runnable fxRunner = new Runnable()
{
public void run()
{
try
{
Toolkit.getToolkit().exitNestedEventLoop(loopLock,
result);
} catch (Throwable t)
{
t.printStackTrace();
}
}
};
Platform.runLater(fxRunner);
}
});

// Start that long process from the FX Thread
longProcess.start();
// The next call will block until exitNestedEventLoop is called, however
// the FX Thread will continue processing UI requests
Object result = Toolkit.getToolkit().enterNestedEventLoop(loopLock);
// Next statement will print: "Result of this long process"
System.out.println("Result is: " + result);

现在,在您使用它之前警告两件重要的事情:

  1. com.sun.javafx.tk.Toolkit 类不是公共(public) API 的一部分,因此 Oracle 保留删除它的权利,恕不另行通知。从 Java 7 到 8u51,我一直在很好地使用它,因此它们可以永远留在那里,更改包/名称或完全消失(不太可能)。

  2. 嵌套循环(和 Swing 的辅助循环)非常适合灵 active 和小型应用程序,但过度使用它们通常会付出代价。嵌套到许多循环(巨大的堆栈跟踪)通常会导致您的应用程序出现“奇怪”的行为,因为您的代码的初始部分可能最终会等待四五件与它们完全无关的事情。我已经看到 FX 嵌套循环在 FX WebEngine executeScript() 调用中导致“空”异常并重复键盘预处理(当配对 FX+Swing 时)以及其他问题。

也就是说,我建议改用 javafx.concurrent.Task(如果有意义的话)。使用 Task 类需要更多的努力,但我认为这是正确的做事方式,并且可能会为您节省大量维护时间。

有关 FX Task 类的额外引用,请参阅这篇很棒的文章:http://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htm

更新:enterNestedEventLoopexitNestedEventLoop 将成为 Java 9 公共(public) API(平台类)的一部分,更多信息请参见 JDK-8090865

希望这对您有所帮助!

关于java - JavaFX 中的 SecondaryLoop,如 Swing?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30765018/

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