我有一个简单的控制台应用程序,有时需要执行图形操作,对于那些我正在使用 JavaFx 框架的应用程序(我需要一些功能,例如文本的 css 样式)我只是将一些形状和文本生成到一个隐藏的场景中然后保存档案中的那些,仅此而已,
我知道要使用 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");
}
}
这是永远不会关闭的线程
“附加监听器” - 线程 t@17 java.lang.Thread.State: RUNNABLE
锁定的可拥有同步器: - 无
“JavaFX 应用程序线程” - 线程 t@13 java.lang.Thread.State:在 com.sun.glass.ui.gtk.GtkApplication._runLoop(本机方法)在 com.sun.glass.ui.gtk.GtkApplication$3 处可运行$1.run(GtkApplication.java:82) 在 java.lang.Thread.run(Thread.java:722)
锁定的可拥有同步器: - 无
更新:我在 Linux Fedora 16 64 位上使用最新的 Oracle JDK 7u17 64 位。