...

понедельник, 14 октября 2013 г.

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. Во всех этих действиях разбросано немножечко грабель. Ничего особенно сложного — просто неочевидности, о которых в руководстве не сказано, а программу в результате не откомпилировать или не запустить.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends:



Комментариев нет:

Отправить комментарий