У меня есть простое консольное приложение, которое иногда нужно выполнять графические операции, для тех, у кого я использую фреймворк JavaFx (есть некоторые функции, которые мне нужны, как стиль CSS для текста) Я просто генерирую некоторые фигуры и текст в скрытую сцену, а затем сохраняю их в файле и все,
Я знаю, что для работы с JavaFx мне нужно передать графические операции в поток JavaFx, но когда все будет готово, и я должен закрыть приложение (через несколько часов), этот поток JavaFx по-прежнему остается открытым... и я действительно не хотите принудительно выходить с System.exit(), потому что если что-то заблокировано, я могу знать/ждать (ТАКЖЕ, я не хочу выполнять все как приложение JavaFx (поскольку компоненты JavaFx составляют менее 1% от моего основное приложение)
код очень прост и googling вокруг Я нашел только использовать
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: RUNNABLE на 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)
Заблокированные управляемые синхронизаторы: - Нет
Обновление: Я использую новейший Oracle JDK 7u17 64bit на Linux Fedora 16 64bit.