【发布时间】:2016-08-03 14:08:27
【问题描述】:
我第一次打开 Shell 并创建一个新的 FXCanvas 设置场景时它工作正常。代码第二次执行(在关闭 Shell 并打开新的 Shell 之后)会抛出“Not on FX application thread”异常。
当我调试时,当第一个新的 FXCanvas 返回时,我在 FX 线程上,如 javafx.application.Platform.isFxApplicationThread() 所示。代码第二次运行时,新的 FXCanvas 返回,我不在 FX 线程上。
如果我将整个过程包装在 Platform.runLater() 中,它在第一次执行时运行良好,但第二次执行永远不会执行 runLater() 中的代码。
如果不清楚,请告诉我。
谢谢。
Java 代码:
package temp;
import java.net.URL;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import javafx.embed.swt.FXCanvas;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
public class SwtWrapper {
public SwtWrapper() {
super();
}
public void go() {
Display display = Display.getDefault();
try {
Shell shell = new Shell(display);
FXCanvas canvas = new FXCanvas(shell, SWT.NONE);
URL url = Class.class.getResource("/temp/Fxml.fxml");
FXMLLoader fxmlLoader = new FXMLLoader(url);
Parent rootNode = fxmlLoader.load();
canvas.setScene(new Scene(rootNode));
canvas.pack();
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if ( !display.readAndDispatch() )
display.sleep();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
display.dispose();
}
}
public static void main(String[] args) {
new SwtWrapper().go();
new SwtWrapper().go();
System.exit(0);
}
}
FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<VBox>
<children>
<Text text="The FX Content." />
<ProgressIndicator />
</children>
</VBox>
Maven 依赖项:
<dependency>
<groupId>org.eclipse</groupId>
<artifactId>swt</artifactId>
<version>4.4-cocoa</version>
<classifier>macosx-x86_64</classifier>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>jfxswt</artifactId>
<version>8.0.0-FINAL</version>
<systemPath>${java.home}/lib/jfxswt.jar</systemPath>
<scope>system</scope>
</dependency>
【问题讨论】: