java-lekcii-2016-01-17 / presentation-nov-7
.docxДополнительные ресурсы
См. Загрузка плагинов из Eclipse Marketplace.docx
build.gradle
apply plugin: 'java'
jar {
manifest {
/**
* Полный адрес класса, в котором находится метод
* public static void main(String[])
*/
attributes 'Main-Class' : 'ru.mami.Main'
}
}
Main.java
package ru.mami;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public final class Main extends Application {
public static void main(String[] args) {
// метод JavaFX, запускающий приложение
// обычно запускается из main
launch(args);
}
/**
* метод, вызываемый JavaFX из метода launch(String[])
*
* этот метод переопределяется для добавления необходимой логики
*/
@Override
public void start(Stage primaryStage) throws Exception {
// заголовок окна
primaryStage.setTitle("Calculator");
// поскольку приложения на Java должны работать на различных платформах,
// чаще всего вместо жестко заданных координат элементов форм
// используются менеджеры раскладки, которые управляют размером и
// положением элементов
// создание менеджера раскладки "таблица"
GridPane grid = new GridPane();
// расположить таблицу по центру, а не в левом верхнем углу
grid.setAlignment(Pos.CENTER);
// пространство между рядами и колонками таблицы
grid.setHgap(10);
grid.setVgap(10);
// пространство между таблицей и краями сцены
grid.setPadding(new Insets(25, 25, 25, 25));
// надпись с возможностью изменения параметров вывода, например, шрифта
Text sceneTitle = new Text("Welcome");
// установка нового шрифта для надписи
//
// новый шрифт в данном случае создается не при помощи конструктора
// (конструктор класса Font скрыт модификатором видимости, и потому не
// может быть вызван из пользовательского класса), а при помощи static
// метода
sceneTitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
// добавление объекта в таблицу
// --------объект
// ----------|-------индекс колонки (индекс первой колонки - 0)
// ----------|-------|--индекс ряда (индекс первого ряда - 0)
// ----------|-------|--|--количество занимаемых элементом колонок
// ----------|-------|--|--|--количество занимаемых элементом рядов
// ----------|-------|--|--|--|
grid.add(sceneTitle, 0, 0, 2, 1);
// метод можно вызвать с 3 параметрами вместо 5, тогда значение
// последних двух параметров будет принято за 1
// надпись без широких возможностей редактирования
Label userName = new Label("User Name:");
grid.add(userName, 0, 1);
// создание поля ввода
TextField userTextField = new TextField();
// установка обработчика события изменения текста в поле ввода
// класс StringProperty, в данном случае получаемый из TextField при
// помощи метода textProperty(), имеет метов addListener, который объект
// любого класса, реализующего интерфейс ChangeListener<String>
// <String> в данном случае означает, что этот ChangeListener должен
// работать с объектами класса String и на этапе компиляции выдавать
// ошибку при попытке вызвать его с другим объектом
// new ChangeListener<String>() означает "создать новый объект
// анонимного и нигде не определенного класса, реализующего интерфейс
// ChangeListener, работающего с объектами класса String"
// далее идет обычное тело класса, реализующего необходимые интерфейсу
// ChangeListener методы
// такой подход к созданию объектов используется тех случаях, когда
// нужен только один объект, т.е. создавать полноценный класс (шаблон
// объектов) ради него нет смысла
// разумеется, в данном случае можно создать в отдельном файле отдельный
// класс, реализующий интерфейс ChangeListener<String>, создать объект
// этого класса и скормить его методу addListener, работать тот и другой
// подходы будут одинаково
userTextField.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable,
String oldValue, String newValue) {
System.out.println(newValue);
}
});
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 submit = new Button("Swap");
// обработчик нажатия кнопки
// логика та же, что и в случае с полем ввода
submit.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// метод меняет значения пароля и имени местами
String username = userTextField.getText();
String password = pwBox.getText();
pwBox.setText(username);
userTextField.setText(password);
}
});
grid.add(submit, 1, 3);
// создание сцены с определенным содержимым
// ширина и высота сцены либо устанавливаются после содержимого (grid,
// 100, 200), либо рассчитываются на основе размеров демонстрируемых
// элементов (как в данном случае)
Scene scene = new Scene(grid);
// установка сцены для демонстрации
primaryStage.setScene(scene);
// демонстрация сцены
primaryStage.show();
}
}
Упражнения
-
Установить из Eclipse Marketplace Buildship Gradle Integration и Minimalist Gradle Editor
-
Создать новый проект Gradle (File -> New -> Other -> Gradle -> Gradle Project, указать название проекта, а все остальное оставить по дефолту)
-
Удалить из проекта автоматически созданные пакеты и классы
-
Добавить класс с методом main, наследующий Application
-
Прописать путь к этому классу в build.gradle
-
Создать в классе GridPane
-
Добавить в GridPane нередактируемое текстовое поле
-
Написать метод, принимающий GridPane, индекс ряда и количество занимаемых колонок и добавляющий в GridPane кнопки от 0 до 9 в соответствии с указанными параметрами. Каждая кнопка должна добавлять соответствующую цифру в конец текстового поля.
-
Добавить кнопки «удалить» и «очистить», удаляющие последнюю цифру и очищающие текстовое поле соответственно.
-
Добавить кнопки «+», «-», «*», «/».
-
Реализовать базовый функционал калькулятора.
-
Собрать приложение в JAR (Java Archive) командой gradle jar.