Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

JavaFX, HelloWorld — продолжение

Anna | 4.06.2014 | нет комментариев
HelloWorld из примера, предложенного Oracle в «Getting Started with JavaFX», на ПК с Windows. Становление простейшего приложения до окна ввода логина и пароля. По-бывшему с применением командной строки с приоткрытием недоговоренностей туториала, в котором приведен код этого приложения.

В предыдущем посте получилось завести пример из первого раздела Getting Started with JavaFX.

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();
    }
}

Пример был скомпилирован, запущен, упакован в jar и запущен из jar с поддержкой командной строки.

Командная строка

@"C:Program FilesJavajdk1.7.0_40binjavac" -d out -classpath "C:Program FilesJavajre7libjfxrt.jar" srchelloworldHelloWorld.java
@"C:Program FilesJavajdk1.7.0_40binjava" -classpath "C:Program FilesJavajre7libjfxrt.jar;.out" helloworld.HelloWorld
@"C:Program FilesJavajdk1.7.0_40binjavafxpackager" -createjar -appclass helloworld.HelloWorld -srcdir .out -outfile HelloWorld -v
@"C:Program FilesJavajre7binjava.exe" -jar HelloWorld.jar
@pause

Всякая команда для комфорта была спрятана в файл .cmd. Комично, но наглядно. Продолжим применять эти команды.

Во втором разделе предлагается сделать форму ввода логина и пароля, с блэкдже элементами управления. Испробуем развить имеющийся пример, оставив как есть пакет и класс &mdash helloworld.HelloWorld. jfxpub-get_started предлагает сделать новейший план в NetBeans. Впрочем, пропустим первые три пункта из «Create the Project», а четвертый, замену тела способа «start» кодом из примера 2-1, применим к имеющемуся у нас файлу HelloWorld.java:

    @Override
	public void start(Stage primaryStage) {
	    primaryStage.setTitle("JavaFX Welcome");

	    primaryStage.show();
	}

Задача сводится к удалению строк с 18 по 29 и замене заголовка primaryStage. В таком виде файл откомпилируется и запустится, но такая галиматья получится, ничего увлекательного. Дальше туториал предлагает применять GridPane layout, потому что оно разрешает создавать столбцы и строки для размещения элементов управления, и это как бы как комфортно. Послушаемся, и добавим код перед primaryStage.show():

	    GridPane grid = new GridPane();
	    grid.setAlignment(Pos.CENTER);
	    grid.setHgap(10);
	    grid.setVgap(10);
	    grid.setPadding(new Insets(25, 25, 25, 25));
	    Scene scene = new Scene(grid, 300, 275);
	    primaryStage.setScene(scene)

А вот это теснее не откомпилируется:

Ошибки компиляции

srchelloworldHelloWorld.java:18: error: cannot find symbol
		GridPane grid = new GridPane();
		^
  symbol:   class GridPane
  location: class HelloWorld
srchelloworldHelloWorld.java:18: error: cannot find symbol
		GridPane grid = new GridPane();
		                    ^
  symbol:   class GridPane
  location: class HelloWorld
srchelloworldHelloWorld.java:19: error: cannot find symbol
		grid.setAlignment(Pos.CENTER);
		                  ^
  symbol:   variable Pos
  location: class HelloWorld
srchelloworldHelloWorld.java:22: error: cannot find symbol
		grid.setPadding(new Insets(25, 25, 25, 25));
		                    ^
  symbol:   class Insets
  location: class HelloWorld
4 errors

Итого: не обнаружены классы GridPane, Pos и Insets. А где их искать? Я тоже не знал. Но на сайте Oracle обнаружил вот такой «справочник». Из него ясно, что

GridPane - Class in javafx.scene.layout
    GridPane lays out its children within a flexible grid of rows and columns.
Pos - Enum in javafx.geometry
    A set of values for describing vertical and horizontal positioning and alignment.
Insets - Class in javafx.geometry
    A set of inside offsets for the 4 side of a rectangular area

Это значит, что нужно добавить строчки импорта:

import javafx.scene.layout.GridPane;
import javafx.geometry.*;

Сейчас файл откомпилируется и запустится, но все еще ничего увлекательного. Продолжим наполнять по рекомендациям туториала. Добавим код с элементами управления позже строчки, устанавливающей качество Padding таблицы grid, то есть, перед Scene scene = new Scene(grid, 300, 275).

Добавка к HelloWorld.java

	    Text scenetitle = new Text("Welcome");
	    scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
	    grid.add(scenetitle, 0, 0, 2, 1);
	    Label userName = new Label("User Name:");
	    grid.add(userName, 0, 1);
	    TextField userTextField = new TextField();
	    grid.add(userTextField, 1, 1);
	    Label pw = new Label("Password:");
	    grid.add(pw, 0, 2);
	    PasswordField pwBox = new PasswordField();
	    grid.add(pwBox, 1, 2);

	    Button btn = new Button("Sign in");
	    HBox hbBtn = new HBox(10);
	    hbBtn.setAlignment(Pos.BOTTOM_RIGHT);
	    hbBtn.getChildren().add(btn);
	    grid.add(hbBtn, 1, 4);

	    final Text actiontarget = new Text();
		    grid.add(actiontarget, 1, 6);

	    btn.setOnAction(new EventHandler<ActionEvent>() {

		@Override
		public void handle(ActionEvent e) {
		    actiontarget.setFill(Color.FIREBRICK);
		    actiontarget.setText("Sign in button pressed");
		}
	    });

Получаем длинную простыню ошибок. Но они теснее знакомы и внятны. Мы, оказывается, не в курсе, кто такие Text, Font, Label, Color и еще некоторые их друзья. Пороемся в упомянутом справочнике, посмотрим, в каких пакетах их родина. Добавим импорт:

import javafx.scene.text.*;
import javafx.scene.control.*;
import javafx.scene.paint.*;
import javafx.scene.layout.HBox;

Такое вот у меня тут произвольное отношение к звездочкам. Вероятно, отменнее поменьше звездочек — чем поменьше импорта, тем стремительней загрузится. Вероятно. Для учебных целей сойдет и так. Кстати, import javafx.scene.* не импортирует автоматом javafx.scene.text.* и import javafx.scene.paint.*.

Сейчас компилируется и работает. Нужно коротенько разобрать наделанное:

  • javafx.application.Application — основной класс приложения JavaFX.
  • Его способ start() является точкой входа.
  • Класс Stage — контейнер верхнего яруса для создания пользовательского интерфейса (окно).
  • Класс Scene — контейнер дальнейшего яруса и содержит все элементы.
  • Наша сцена основана на GridPane, которая является как бы таблицей, в ячейках которой дозволено расположить элементы интерфейса. HGap и VGap определяют зазор между столбцами и строками соответственно. Padding задает зазор между краем таблицы и краем окна, тот, что таблица постарается по вероятности выдерживат. Строчка «grid.setGridLinesVisible(true);» покажет таблицу в окне — сделает ее линии видимыми.
  • Увлекательно, что число строк и столбцов таблицы не задается ее свойствами. Взамен этого мы располагаем некоторые элементы в определенных ячейках (задавая столбец и строку), а таблица «сама» разрастается до надобного числа. Способ grid.add добавляет элемент (1-й параметр) в указанную ячейку (2-й и 3-й параметр — столбец, строка). Дозволено добавить четвертый и пятый параметры (как при добавлении scenetitle) — сколько столбцов и строк применять под элемент.
  • Способ main() не является нужным для приложений JavaFX, если JAR-файл сделан с поддержкой javafxpackager (он внедряет JavaFX Launcher в JAR-файл). Впрочем, благотворно оставить данный способ, Дабы иметь вероятность запускать JAR-файл, сделанный без JavaFX Launcher, скажем, в IDE с неполной интеграцией с JavaFX. Вновь же, Swing-приложения, включающие код JavaFX, требуют способ main().
  • HBox — это такая особая панелька, которая разрешает задать выравнивание кнопки, запихнутой в эту панельку, отличающимся от остальных элементов — с правого края.
  • Остальное довольно видимо из кода.

Осталось раскрасить это все с поддержкой CSS, нарисовать с поддержкой FXML и объединить эти буквы совместно в одном приложении.

И еще один увлекательный момент, которым хотелось бы поделиться напоследок. В прошлом посте я упомянул, что если в коде приложения пакет обозвать package HelloWorld, то в папке ./out создастся папка HelloWorld, программа откомпилируется,но не запустится — не будет обнаружен класс. Исправим обратно регистр символов в наименовании пакета — все вновь заработает, правда регистр символов папки останется «неправильным». ОС Windows на регистр имени папки абсолютно плевать, и пересоздавать либо переименовывать ее система не будет. На запуск программы из файла HelloWorld.class это не повлияет. А вот если сейчас упаковать в .JAR и попытаться его исполнить — полезут ошибки. В архиве папка будет с неправильным (теснее без кавычек) регистром 2-х символов, и этого довольно, Дабы не обнаружить основной класс приложения. Придется стереть папку ./out/HelloWorld, снова откомпилировать и сделать .jar.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB