我知道要使用JavaFx,必须将图形操作传递给JavaFx线程,但当所有事情都完成并且我必须关闭应用程序(几个小时后),这个JavaFx线程仍然保持打开状态...我真的不想强制退出System.exit(),因为如果某些东西被阻止,我可能想要知道/等待(而且我不想将所有内容都作为JavaFx应用程序执行(因为JavaFx组件少于我的主要应用程序的1%))
代码非常简单,通过搜索我发现只能使用
Platform.exit();
这似乎不起作用,我也尝试过调整平台参数,比如
Platform.setImplicitExit(false);
这是我的测试应用程序,您可以运行:
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.geometry.Pos;
import javafx.scene.layout.VBox;
public class SOTestFX {
public static void main(String[] args) {
SOTestFX t = new SOTestFX();
t.runFxThread();
}
public void runFxThread(){
//Application.launch(args);
final JFXPanel jfxPanel = new JFXPanel();
Platform.runLater(new Runnable() {
@Override
public void run() {
System.err.println("CREATING IMAGE");
simpleFXoperations();
System.err.println("NOW CALL EXIT");
System.err.println("JAVA FX THREAD SHOULD BE EXITED NOW");
Platform.exit();
}
});
try {
Thread.sleep(3000); // just wait a bit if something should happen, let it happen..
} catch (InterruptedException e) {
e.printStackTrace();
}
//jfxPanel.removeNotify(); // return -> java.lang.NullPointerException
//Platform.exit(); // -> does nothing
System.err.println("i will never die!");
}
public void simpleFXoperations(){
VBox vbox1 = new VBox();
vbox1.setAlignment(Pos.BOTTOM_CENTER);
vbox1.setStyle("-fx-border-style: solid;"
+ "-fx-border-width: 1;"
+ "-fx-border-color: white");
System.err.println("simpleFXoperations() _DONE");
}
}
这是一个从未关闭的线程:
"Attach Listener" - 线程 t@17 java.lang.Thread.State: RUNNABLE
已锁定的可拥有同步器: - 无
"JavaFX 应用程序线程" - 线程 t@13 java.lang.Thread.State: RUNNABLE at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) at com.sun.glass.ui.gtk.GtkApplication$3$1.run(GtkApplication.java:82) at java.lang.Thread.run(Thread.java:722)
已锁定的可拥有同步器: - 无
更新:我正在使用 Linux Fedora 16 64位上最新的 Oracle JDK 7u17 64位。
Platform.exit
在你的测试用例中无法工作。请尝试在 https://javafx-jira.kenai.com 提交一个问题。 - jewelsea