JavaFX — безыдейный HelloWorld

от автора

HellWorld
Описание запуска HelloWorld из примера, предложенного Oracle в «Getting Started with JavaFX», но безыдейно, то есть, без IntelliJ IDEA и вообще какой-либо IDE. Реализовано на ПК с Windows. Опус относится к классу «Чайник — чайнику». Внезапно оказалось, что для компиляции и запуска простейшего приложения из командной строки недостаточно информации туториала, в котором приведен код этого приложения.

Человеку опытному такие записки могут показаться забавными. Однако, тем, кто только подошел к полю, усеянному граблями, подобный путеводитель может быть полезным.

Спросите — зачем, собственно? Для обучения, как и все HelloWorld`ы. Не хочу умалять значения IDE и заявлять: «Только блокнот! Только хардкор!» Но командная строка позволяет если и не понять всю механику, то хотя бы заглянуть под капот. Особенно когда некоторый опыт программирования за еду уже есть. Внезапно возникло желание расширить горизонты и освоить, ну, допустим, Java. По крайней мере, попробовать.

Есть совершенно замечательный пост Работа с Java в командной строке от Qwertovsky. Все же, для дальнейшего погружения маловато голой консоли, хочется окошек. Желательно, в виде десктопного приложения. Почитал, какие есть варианты создания GUI для Java-программ, и что о них думает народ, остановился пока на JavaFX. Оказалось, что на русском в разного рода интернетах про JFX написано довольно мало, и существенной частью про первую версию. Значит, придется рыть на сайте Oracle.

jfxpub-overview сообщает нам, что, поскольку JavaFX-приложения пишутся на языке Java, я могу использовать для их создания свой любимый редактор или какую-нибудь IDE (NetBeans, Eclipse или IntelliJ IDEA). Предлагается заглянуть на сайт www.oracle.com и скачать Oracle® JDK 7 с поддержкой JavaFX 2.2.n, а потом воспользоваться пособием jfxpub-get_started, чтобы создать простое приложение, демонстрирующее работу со слоями, таблицами стилей и визуальными эффектами. Еще там предлагается использовать JavaFX Scene Builder для разработки пользовательского интерфейса без кодинга, но это как-нибудь потом.

Установлен JDK и (на всякий случай) JRE. У меня в системную переменную PATH само ничего не прописалось, и я вручную прописывать не стал.

Берем упомянутый пример как есть.

HelloWorld.java

package helloworld;   import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; import javafx.stage.Stage;   public class HelloWorld extends Application {     public static void main(String[] args) {         launch(args);     }          @Override     public void start(Stage primaryStage) {         primaryStage.setTitle("Hello World!");         Button btn = new Button();         btn.setText("Say 'Hello World'");         btn.setOnAction(new EventHandler<ActionEvent>() {               @Override             public void handle(ActionEvent event) {                 System.out.println("Hello World!");             }         });                  StackPane root = new StackPane();         root.getChildren().add(btn);         primaryStage.setScene(new Scene(root, 300, 250));         primaryStage.show();     } } 

Авторы пособия предлагают использовать NetBeans IDE 7.3. Обойдемся. Делаем папку для проекта, допустим, D:\GetStart\, в ней создаем папку для исходников src и папку для результатов компиляции out. Раз уж пробный класс относится к пакету helloworld, надо сделать одноименную папку в src и положить туда файл HelloWorld.java.

Чтобы это компилировалось, сделаем в корне проекта файл compile.cmd. Так удобнее вносить правки в команду компиляции — не надо полагаться на память интерпретатора командной строки, и вообще, можно обойтись без cmd.exe, пользоваться любимым файловым менеджером, а хоть бы и проводником.

jfxpub-overview рассказал, что JavaFX полностью встроен в Java SE 7 JRE и JDK. На странице downloads желающим скачать JavaFX для Java SE 7 предлагают просто скачать Java SE 7. Среди файлов JDK нет javafxc и javafx. По всей видимости, скомпилировать JFX-приложение можно так же, как и любой другой java-файл. Поэтому в командный файл запишем две строчки:

@"C:\Program Files\Java\jdk1.7.0_40\bin\javac" -d out src\helloworld\HelloWorld.java @pause 

Вторая строчка дает возможность рассмотреть сообщения об ошибках. Если же в появившемся окне cmd.exe будет единственное сообщение «Для продолжения нажмите любую клавишу…», значит, предыдущая команда выполнена без ошибок.

Однако, запуск выдаст длинную простыню, которая, вероятно, вся даже не влезет в окно вывода. 18 ошибок, что-то не найдено, что-то не существует. Чтобы посмотреть все сообщения полностью, можно первую строчку CMD-файла дополнить перенаправлением потока вывода ошибок в файл «2> result.txt».

Ошибки

src\helloworld\HelloWorld.java:3: error: package javafx.application does not exist import javafx.application.Application;                          ^ src\helloworld\HelloWorld.java:4: error: package javafx.event does not exist import javafx.event.ActionEvent;                    ^ ...   symbol:   class Scene   location: class HelloWorld src\helloworld\HelloWorld.java:15: error: method does not override or implement a method from a supertype 	@Override 	^ 18 errors 

Компилятор не может найти пакеты JFX. Надо ему подсказать, а для этого надо узнать самому. Может быть, я не очень внимательно рылся, но на сайте Oracle не нашел, точнее, нашел только на форуме. Искомый файл — jfxrt.jar (логично — JavaFX Run Time), и он лежит в JRE, то есть, у меня, например, в C:\Program Files\Java\jre7\lib и C:\Program Files\Java\jdk1.7.0_40\jre\lib. Добавим опцию -classpath:

@"C:\Program Files\Java\jdk1.7.0_40\bin\javac" -d out -classpath "C:\Program Files\Java\jre7\lib\jfxrt.jar" src\helloworld\HelloWorld.java @pause 

Теперь компилируется. Создалась папка ./out/helloworld, и в ней файл HelloWorld.class. Если баловства ради в файле .java переименовать пакет в package HelloWorld, то и папка создастся в соответствующем регистре — ./out/HelloWorld, вот только приложение не запустится.

Хотелось бы запустить. В упомянутой теме на форуме Oracle предлагается вариант с упаковкой в jar, но попробуем сначала запустить так. Сделаем еще командный файл run.cmd с заранее указанной библиотекой JFX:

@"C:\Program Files\Java\jdk1.7.0_40\bin\java" -classpath "C:\Program Files\Java\jre7\lib\jfxrt.jar" helloworld.HelloWorld @pause 

При запуске получим ошибку:

Error: Could not find or load main class helloworld.HelloWorld 

Ну что ж, значит, classpath еще маловат, надо указать и место жительства нашего откомпилированного класса:

@"C:\Program Files\Java\jdk1.7.0_40\bin\java" -classpath "C:\Program Files\Java\jre7\lib\jfxrt.jar;.\out" helloworld.HelloWorld @pause 

Запуск этой команды наконец-то приведет к появлению окошка с кнопкой с иллюстрации get_started. При этом будет видна и консоль cmd.exe. Нажатие на кнопку в окошке приведет к появлению сообщения «Hello World!» в консоли.

Упаковать в jar все-таки хотелось бы. Воспользуемся утилитой javafxpackager. Запущенная в консоли без параметров, она выдает довольно подробную и понятную справку по своим опциям. Можно сделать файл jar.cmd:

@"C:\Program Files\Java\jdk1.7.0_40\bin\javafxpackager" -createjar -appclass helloworld.HelloWorld -srcdir .\out -outfile HelloWorld -v @pause 

Из проводника получившийся jar у меня запускается двойным щелчком мышки. Однако, файловый менеджер заходит в этот файл, как в архив (коим файл, собственно, и является). Кроме того, в проводнике файл запускается без консоли. Поэтому для удобства я добавил еще и run_jar.cmd:

@"C:\Program Files\Java\jre7\bin\java.exe" -jar HelloWorld.jar @pause 

Работает!

Далее в руководстве предлагается сделать окно ввода логина и пароля с целью обучения основам размещения элементов, потом из этого окна делается стильная красотулечка с использованием каскадных таблиц стилей (CSS), затем рисуется эта же форма, но с помощью FXML. Во всех этих действиях разбросано немножечко грабель. Ничего особенно сложного — просто неочевидности, о которых в руководстве не сказано, а программу в результате не откомпилировать или не запустить.

ссылка на оригинал статьи http://habrahabr.ru/post/197494/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *