Почему мое приложение JavaFx не имеет фрейма при запуске на моем RaspberryPi?
Я установил JDK 8 на свой Raspberry Pi и пытаюсь запустить пример приложения javaFx. Моя ОС - Распбиан. Я использую пример приложения "DigitalClock", которое поставляется с Netbeans 8. Приложение запускается и запускается на Pi, но когда это происходит, оно почти на весь экран и имеет большую черную рамку вокруг основного вида. Кроме того, в приложении нет рамки. Нет кнопки выхода или сворачивания. Честно говоря, я не знаю, как закрыть приложение или просто запустить его в маленьком окне. Чтобы возобновить использование моего Pi, я должен отключить его и перезагрузить.
Что я здесь не так делаю?
1 ответ
Разработчик JavaFX Даниэль Блаукопф объяснил это на форуме Raspberry Pi:
JavaFX на Raspberry Pi использует кадровый буфер, а не рабочий стол X11. Он занимает весь экран. Смотрите вики-страницу open-jfx на Raspberry Pi.
JavaFX с ускоренной графикой на Raspberry Pi работает только в полноэкранном режиме. Было бы возможно сделать неускоренную графику в окне, но производительность была бы довольно плохой. Реализация EGL на Pi не поддерживает OpenGL в окне X11, по крайней мере, не раз, когда я проверял.
Я также собираюсь скопировать связанную информацию из open-jfx wiki здесь в случае, если страница wiki умирает:
JavaFX на Raspberry Pi занимает весь экран и захватывает все устройства ввода Linux. Хотя такое поведение обычно требуется в развернутом приложении, оно менее удобно для разработки, поскольку вы не можете остановить приложение, использующее control-C, если приложение JavaFX не имеет
KeyEvent
обработчик, который прослушивает control-C и звонкиPlatform.exit()
, В этом нет ничего необычного - многие полноэкранные консольные приложения для Linux ведут себя одинаково - но часто бывает полезно иметь быстрый способ завершить приложение во время разработки без изменения кода приложения.Существует два способа запуска приложений с возможностью завершения с помощью control-C:
Запускайте приложения через соединение SSH с ПК. Это дает больший контроль над устройством, потому что, как только вы настроите соединения SSH, вы можете использовать их и для других целей.
В качестве альтернативы, вы можете использовать встроенную функцию отладки для перехвата control-C. Если вы установите переменную среды
JAVAFX_DEBUG=1
перед запуском Java JavaFX завершит работу, когда вы нажмете control-C. Например:
JAVAFX_DEBUG=1
/opt/jdk1.8.0/bin/java -cp Stopwatch.jar stopwatch.MainScreen
Переменная среды JAVAFX_DEBUG предназначена только для использования в разработке, и вы не должны полагаться на нее при развертывании приложения. В будущем эта функциональность может быть указана иначе или быть удалена.
Ответы на дополнительные вопросы
Существует ли "наилучшая практика", позволяющая пользователю выходить из приложения JavaFX, работающего в полноэкранном режиме? Я бы хотел, чтобы мои пользователи могли запускать мое приложение, использовать его, а затем закрывать.
Вы должны кодировать свое приложение, чтобы включить достаточно очевидный элемент пользовательского интерфейса, который позволит пользователю закрыть приложение. Например, поместив кнопку закрытия на главном экране приложения или предоставив опцию закрытия меню:
Button close = new Button("Close");
close.setOnAction(
new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
primaryStage.close();
// or Platform.exit();
}
}
);
Если вы также хотите, чтобы приложение отвечало и выходило из комбинации клавиш, например Ctrl + C, вы можете дополнительно включить ускоритель комбинации клавиш:
primaryStage.getScene().getAccelerators().put(
KeyCombination.keyCombination("CTRL+C"),
new Runnable() {
@Override
public void run() {
Platform.exit();
}
}
);