JFXPanel setScene freezing с помощью Java 11 - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу интегрировать openjfx в мой код Java 11.Используя IntelliJ IDEA 2018.2.6 в Windows 10, я создал тестовый проект и опробовал приведенный ниже код

import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.control.TabPane;

public class Java11FXTestApplication {



    public static void main(String[] args) {
        JFXPanel dummyPanel;
        TabPane dummyTabPane;
        Scene dummyScene;
        System.out.println("Creating JFX Panel");
        dummyPanel = new JFXPanel();
        System.out.println("Creating  TabPane");
        dummyTabPane = new TabPane();
        System.out.println("Creating  Scene");
        dummyScene = new Scene(dummyTabPane);
        System.out.println("Setting  Scene");
        dummyPanel.setScene(dummyScene); //Freezing here
        System.out.println("Scene Created");
    }
}

, этот код зависает при вызове метода setScene ().Я попытался отладить его и обнаружил, что его код ждет бесконечно в вызове secondLoop.enter () в методе JFXPanel.setScene.Любая идея, почему?

Этот код прекрасно работает в JDK-8, но не работает с java-11.0.1.

Я не получаю с этой проблемойзастрял на Java11X JavaFX проблема.Что-то не так с кодом?или о любой сообщенной проблеме с javafx для java11

1 Ответ

0 голосов
/ 16 ноября 2018

Вы устанавливаете Scene в главном потоке.Из документации JFXPanel ( упор мой):

Существуют некоторые ограничения, связанные с JFXPanel.Как компонент Swing, к нему следует обращаться только из потока диспетчеризации событий, за исключением метода setScene(javafx.scene.Scene), который можно вызывать либо в потоке диспетчеризации событий, либо в потоке приложения JavaFX.

Завершение setScene в вызове Platform.runLater (или SwingUtilities.invokeLater).

Platform.runLater(() -> {
    dummyPanel.setScene(dummyScene);
    System.out.println("Scene Created");
});

Обратите внимание, что с вашим текущим кодом, когда main вернет, JVM продолжит работу,Создание JFXPanel инициализирует среду выполнения JavaFX, которая не завершится, пока не закроется последнее окно (только когда Platform.isImplicitExit равно true) или Platform.exit вызвано.Поскольку ваш код не выполняет ни одной из этих функций, среда выполнения JavaFX продолжит работать.


В документации JFXPanel также приведен пример того, как его можно использовать (обратите внимание, что почти все происходит на Поток отправки события или Поток приложения JavaFX ):

Вот типичный пример использования JFXPanel:

 public class Test {

     private static void initAndShowGUI() {
         // This method is invoked on Swing thread
         JFrame frame = new JFrame("FX");
         final JFXPanel fxPanel = new JFXPanel();
         frame.add(fxPanel);
         frame.setVisible(true);

         Platform.runLater(new Runnable() {
             @Override
             public void run() {
                 initFX(fxPanel);
             }
         });
     }

     private static void initFX(JFXPanel fxPanel) {
         // This method is invoked on JavaFX thread
         Scene scene = createScene();
         fxPanel.setScene(scene);
     }

     public static void main(String[] args) {
         SwingUtilities.invokeLater(new Runnable() {
             @Override
             public void run() {
                 initAndShowGUI();
             }
         });
     }
 }
...