Этап JavaFX * иногда * кажется пустым на Win10 - PullRequest
0 голосов
/ 23 апреля 2020

Мой класс расширяет стадию JavaFX. В среде разработки его никогда не удается загрузить и обработать, но мои пользователи регулярно сообщают, что иногда он неправильно отображает , который выглядит так на Windows 10 .

Сам класс это довольно стандартное дело, я запускаю его с помощью Platform.runLater () и поток обрабатывает, как и ожидалось. Каждый вывод журнала записывается, и можно взаимодействовать с экраном, как запрограммировано, или закрыть его, что не вызывает каких-либо ошибок или исключений.

Конструктор рабочей области довольно прост c:

  log.debug("Constructing the screen.");

  setTitle("Screen");
  setAlwaysOnTop(true);
  initStyle(StageStyle.UNDECORATED);

  try {
        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setLocation(getClass().getResource("....fxml"));

        Pane panel = fxmlLoader.load();
        controller = fxmlLoader.getController();
        controller.postInit(currentIdle); // some elements processed

        Scene scene = new Scene(panel);
        setScene(scene);

        scene.setOnKeyPressed(controller::handleKeyEvent);
        setOnHiding((WindowEvent e) -> processor::leaveScreen);
        log.debug("Showing the screen.");
        show();
        log.debug("Screen shown.");

        requestFocus();
        log.debug("Finished constructing the screen.");

} catch (IOException e) {
    // ...doesn't go here
}

Из журналов, кажется, все работает как задумано, в том числе элементы управления, сочетания клавиш и перехватчик метода exitScreen (), и не выдается никаких исключений, за исключением того, что пользователь иногда не может видеть содержимое и элементы управления на экране. .

На что я смотрю? Это проблема с моим кодом или ошибка JavaFX? Проблема с графикой на ноутбуке пользователя? Можете ли вы придумать способ предотвратить или, по крайней мере, обнаружить это состояние и каким-либо образом принудительно вызвать refre sh?

В качестве альтернативы, при каких обстоятельствах возможно, что этап JavaFX проходит свой метод show () без ошибки , но на самом деле не показывает его содержимое?

Затрагиваемые среды: все комбинации последних версий JDK 14 GA, Corretto 11 (пользовательский образ, созданный jlink) и JavaFX 11.0.2 или 14.0.1 - это не имеет значения. Это также происходит независимо от того, установлено ли приложение с JRE с помощью jlink, используя jpackage или Advanced Installer.

1 Ответ

0 голосов
/ 24 апреля 2020

Трудно помочь без дополнительной информации, но 2 вещи, которые мне приходилось использовать в прошлом для решения windows, были

Thread.currentThread().setContextClassLoader(App.class.getClassLoader());

, помещенными в начале метода start(Stage stage), где App очевидно заменяется именем вашего класса, расширяющим Application

Другое «исправление», которое я использовал, это

System.setProperty("glass.accessible.force", "false");

в качестве обходного пути для проблем с нажатием не в фокусе Вершины

...