Глухих Михаил Игоревич mailto: glukhikh@mail
TRANSCRIPT
Глухих Михаил Игоревичmailto: [email protected]
Основная тема:◦ desktop applications under JavaFX (Java)
◦ … and tornadofx (Kotlin)
Дополнительные темы:◦ Концепции GUI-приложений
◦ Краткий экскурс в историю (AWT/Swing)
◦ Краткий экскурс в Web
PHP, JS, Kotlin/JS, Ktor
Не затрагиваемые темы◦ Android SDK (но можно изучить самостоятельно)
2
Программа отвечает на запросы, а не действует активно◦ Консольное приложение получает задачу и
решает её
Иногда переключаясь на режим «вопрос (программы) – ответ (пользователя)»
◦ GUI-приложение функционирует в режиме «запрос (пользователя) – ответ (программы)»
Иногда переключаясь на режим «вопрос (программы) – ответ (пользователя)»
3
Программа отвечает на запросы, а не действует активно
Механизм событий (сообщений, сигналов) для получения информации от пользователя (окружения)◦ Поток обработки сообщений
4
5
начало
создание главного окна
ожидание события
обработкасобытия
выход?
разрушение главного окна
конец
да
нет
С точки зрения структуры программы◦ Исторически
Создание главного окна
Запуск цикла обработки сообщений
6
С точки зрения структуры программы◦ Исторически
Создание главного окна
Запуск цикла обработки сообщений
◦ Современность
Создание главного окна (или приложения с окном)
Обработка сообщений
Логика инициализации обычно зашивается внутрь библиотеки и не видна прикладному программисту
7
Механизм компонентов (элементов, элементов управления) для представления графической информации◦ Компонент ~ прямоугольник с содержимым
Component/JComponent в AWT/Swing
Node/Control в JavaFX
◦ Контейнер = содержит другие компоненты
Container/JContainer в AWT/Swing
Parent в JavaFX
◦ Менеджер размещения: управляет размещением компонентов в контейнере
8
Механизм компонентов (элементов, элементов управления) для представления графической информации
Механизм перерисовки через события◦ Нет (в непосредственном виде) функции
«нарисовать окно»
◦ Как по команде от ОС (событие)
◦ Так и по команде от программы (отправка этого события)
◦ Набор графических примитивов для отрисовки
9
10
События обеспечивают связь…◦ с периферийными устройствами (мышь,
клавиатура)◦ с изменением состояния одного из
компонентов приложения◦ с изменением состояния рабочего стола◦ с изменением состояния нитей, таймеров и
других составляющих приложения◦ …
Механизм компонентов (элементов, элементов управления) для представления графической информации
Механизм перерисовки через события
Редактор форм◦ Предназначен для интерактивного описания
GUI-компонентов
11
Механизм компонентов (элементов, элементов управления) для представления графической информации
Механизм перерисовки через события
Редактор форм◦ Поддерживается IDE и/или плагинами к ней
Для Swing см. https://habr.com/ru/post/305974/
Для JavaFX см.
https://gluonhq.com/products/scene-builder
https://docs.oracle.com/javafx/scenebuilder/1/use_java_ides/sb-with-intellij.htm
https://docs.oracle.com/javafx/2/get_started/fxml_tutorial.htm
12
13
Библиотеки AWT + Swing (= JFC)◦ AWT (1995 год)
Поддержка GUI через peer-интерфейсы
Метод на Java вызывает «родную» (native) функцию ОС для работы с GUI
14
Component◦ Container
Frame
Panel
Dialog
…
◦ Label
◦ Button
◦ ComboBox
◦ …
15
Библиотеки AWT + Swing (= JFC)◦ AWT (1995 год)
Поддержка GUI через peer-интерфейсы
Метод на Java вызывает «родную» (native) функцию ОС для работы с GUI
◦ Swing (1998 год)
«Тяжёлые» компоненты ~ как в AWT
«Лёгкие» компоненты = напрямую не связаны с API операционной системы
Кросс-платформенная архитектура = приложение одинаково выглядит везде
16
heavyweight component: всегда имеет привязанное к нему окно ОС◦ Любой наследник Component, но не JComponent
lightweight component: переиспользуетокно ОС ближайшего «тяжелого» родителя◦ Любой наследник JComponent
17
Container (bold are heavy-weight!)◦ JFrame -> Frame
◦ JDialog -> Dialog
◦ JWindow, JApplet
◦ JComponent
JPanel
JLabel
JButton
JComboBox
…
18
Container◦ Window
JWindow
Frame
JFrame
Dialog
JDialog
◦ Panel
Applet
JApplet
19
Библиотеки AWT + Swing (= JFC)
Библиотека JavaFX◦ Создана в 2007-2008, изначально в виде языка
JavaFX Script
◦ Вошла в JRE / JDK в 2014
◦ Не только Desktop, но и Web
◦ Считается более современной и продвинутой
20
Зависит от версии JDK◦ 1.8, 9, 10 = работает из коробки (часть JDK)
◦ 11+ = нужна Maven/Gradle-зависимость, или загруженный Jar-файл (библиотека)
21
Библиотеки AWT + Swing (= JFC)
Библиотека JavaFX◦ Организация на основе Scene Tree (по сути дела
это дерево компонентов, в JavaFX - узлов)
◦ Графические примитивы входят в дерево узлов
◦ Нет выделенной функции отрисовки
22
Control◦ Button
◦ CheckBox
◦ List
Shape◦ Circle
◦ Rectangle
◦ Polygon
23
Библиотеки AWT + Swing (= JFC)
Библиотека JavaFX
Android SDK◦ Разработка под ОС Android, 2009 год (v1)
◦ 2017 год (v26)
◦ Сейчас (2021 год) уже v31
24
Библиотеки AWT + Swing (= JFC)
Библиотека JavaFX
Android SDK
Другие◦ SWT (Eclipse, 2003)
◦ Qt Jambi (open-source)
◦ Java OpenGL = JOGL (2010)
◦ Java 3D (on top of OpenGL or Direct3D, 2008)
25
Всё, что есть для Java +◦ tornadofx
DSL для JavaFX
https://tornadofx.io/
◦ JetPack compose (currently beta-version)
DSL для Android SDK
https://developer.android.com/jetpack/compose
DSL = Domain Specific Language (проблемно-ориентированный язык)
26
27
28
Все, что требуется сделать - создать окно Frame, задать его размеры setSize, отобразить его на экране setVisible и создать обработчик закрытия окна addWindowListener
Логика создания нити обработки событий зашита внутрь библиотеки
29
public class MainFrame extends Frame {
MainFrame(String s) {
super(s);
setSize(400, 400);
setVisible(true);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
public static void main(String[] args) {
new MainFrame("Приложение AWT");
}
}
30
Все делается примерно аналогично
Вместо класса Frame (AWT) используется класс JFrame (Swing)
31
public class MainFrame extends JFrame {
MainFrame(String s) {
super(s);
setSize(400, 400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MainFrame("Приложение Swing");
}
});
}
}
Создателями Swing рекомендуется вызывать конструктор главного фрейма в потоке обработки сообщений
Для этой цели служит метод SwingUtilities.invokeLater(runnable);
Runnable – интерфейс "запускаемый" с одним методом run
32
33
public class MainFrame extends JFrame {
MainFrame(String s) {
super(s);
setSize(400, 400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(
() -> new MainFrame("Простое окно Swing")
);
}
}
Application
Stage
Scene / SceneGraph
Nodes
+ [tornadofx]◦ [App]
◦ View
34
public class HelloJavafx extends Application {
public void start(Stage primaryStage) {
Group root = new Group();
Scene scene = new Scene(root, 400, 300);
primaryStage.setScene(scene);
primaryStage.setTitle("Hello, JavaFX");
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
35
class HelloView : View("Простое окно JavaFX") {
override val root = BorderPane()
}
class HelloApp : App(HelloView::class)
fun main(args: Array<String>) {
Application.launch(
HelloApp::class.java, *args)
}
36
37
Рассмотрены◦ Основные концепции GUI
Далее◦ Создание приложений
◦ …
Вопросы?