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

в 13:16, , рубрики: hello world, java, javafx, Программирование, чайник - чайнику, метки: , , ,

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 FilesJavajdk1.7.0_40binjavac" -d out srchelloworldHelloWorld.java
@pause

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

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

Ошибки

srchelloworldHelloWorld.java:3: error: package javafx.application does not exist
import javafx.application.Application;
                         ^
srchelloworldHelloWorld.java:4: error: package javafx.event does not exist
import javafx.event.ActionEvent;
                   ^
...
  symbol:   class Scene
  location: class HelloWorld
srchelloworldHelloWorld.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 FilesJavajre7lib и C:Program FilesJavajdk1.7.0_40jrelib. Добавим опцию -classpath:

@"C:Program FilesJavajdk1.7.0_40binjavac" -d out -classpath "C:Program FilesJavajre7libjfxrt.jar" srchelloworldHelloWorld.java
@pause

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

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

@"C:Program FilesJavajdk1.7.0_40binjava" -classpath "C:Program FilesJavajre7libjfxrt.jar" helloworld.HelloWorld
@pause

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

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

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

@"C:Program FilesJavajdk1.7.0_40binjava" -classpath "C:Program FilesJavajre7libjfxrt.jar;.out" helloworld.HelloWorld
@pause

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

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

@"C:Program FilesJavajdk1.7.0_40binjavafxpackager" -createjar -appclass helloworld.HelloWorld -srcdir .out -outfile HelloWorld -v
@pause

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

@"C:Program FilesJavajre7binjava.exe" -jar HelloWorld.jar
@pause

Работает!

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

Автор: RomeoGolf

Источник

Поделиться

* - обязательные к заполнению поля