Глухих Михаил Игоревич mailto: glukhikh@mail

37
Глухих Михаил Игоревич mailto: [email protected]

Transcript of Глухих Михаил Игоревич mailto: glukhikh@mail

Page 1: Глухих Михаил Игоревич mailto: glukhikh@mail

Глухих Михаил Игоревичmailto: [email protected]

Page 2: Глухих Михаил Игоревич mailto: glukhikh@mail

Основная тема:◦ desktop applications under JavaFX (Java)

◦ … and tornadofx (Kotlin)

Дополнительные темы:◦ Концепции GUI-приложений

◦ Краткий экскурс в историю (AWT/Swing)

◦ Краткий экскурс в Web

PHP, JS, Kotlin/JS, Ktor

Не затрагиваемые темы◦ Android SDK (но можно изучить самостоятельно)

2

Page 3: Глухих Михаил Игоревич mailto: glukhikh@mail

Программа отвечает на запросы, а не действует активно◦ Консольное приложение получает задачу и

решает её

Иногда переключаясь на режим «вопрос (программы) – ответ (пользователя)»

◦ GUI-приложение функционирует в режиме «запрос (пользователя) – ответ (программы)»

Иногда переключаясь на режим «вопрос (программы) – ответ (пользователя)»

3

Page 4: Глухих Михаил Игоревич mailto: glukhikh@mail

Программа отвечает на запросы, а не действует активно

Механизм событий (сообщений, сигналов) для получения информации от пользователя (окружения)◦ Поток обработки сообщений

4

Page 5: Глухих Михаил Игоревич mailto: glukhikh@mail

5

начало

создание главного окна

ожидание события

обработкасобытия

выход?

разрушение главного окна

конец

да

нет

Page 6: Глухих Михаил Игоревич mailto: glukhikh@mail

С точки зрения структуры программы◦ Исторически

Создание главного окна

Запуск цикла обработки сообщений

6

Page 7: Глухих Михаил Игоревич mailto: glukhikh@mail

С точки зрения структуры программы◦ Исторически

Создание главного окна

Запуск цикла обработки сообщений

◦ Современность

Создание главного окна (или приложения с окном)

Обработка сообщений

Логика инициализации обычно зашивается внутрь библиотеки и не видна прикладному программисту

7

Page 8: Глухих Михаил Игоревич mailto: glukhikh@mail

Механизм компонентов (элементов, элементов управления) для представления графической информации◦ Компонент ~ прямоугольник с содержимым

Component/JComponent в AWT/Swing

Node/Control в JavaFX

◦ Контейнер = содержит другие компоненты

Container/JContainer в AWT/Swing

Parent в JavaFX

◦ Менеджер размещения: управляет размещением компонентов в контейнере

8

Page 9: Глухих Михаил Игоревич mailto: glukhikh@mail

Механизм компонентов (элементов, элементов управления) для представления графической информации

Механизм перерисовки через события◦ Нет (в непосредственном виде) функции

«нарисовать окно»

◦ Как по команде от ОС (событие)

◦ Так и по команде от программы (отправка этого события)

◦ Набор графических примитивов для отрисовки

9

Page 10: Глухих Михаил Игоревич mailto: glukhikh@mail

10

События обеспечивают связь…◦ с периферийными устройствами (мышь,

клавиатура)◦ с изменением состояния одного из

компонентов приложения◦ с изменением состояния рабочего стола◦ с изменением состояния нитей, таймеров и

других составляющих приложения◦ …

Page 11: Глухих Михаил Игоревич mailto: glukhikh@mail

Механизм компонентов (элементов, элементов управления) для представления графической информации

Механизм перерисовки через события

Редактор форм◦ Предназначен для интерактивного описания

GUI-компонентов

11

Page 12: Глухих Михаил Игоревич mailto: glukhikh@mail

Механизм компонентов (элементов, элементов управления) для представления графической информации

Механизм перерисовки через события

Редактор форм◦ Поддерживается 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

Page 13: Глухих Михаил Игоревич mailto: glukhikh@mail

13

Page 14: Глухих Михаил Игоревич mailto: glukhikh@mail

Библиотеки AWT + Swing (= JFC)◦ AWT (1995 год)

Поддержка GUI через peer-интерфейсы

Метод на Java вызывает «родную» (native) функцию ОС для работы с GUI

14

Page 15: Глухих Михаил Игоревич mailto: glukhikh@mail

Component◦ Container

Frame

Panel

Dialog

◦ Label

◦ Button

◦ ComboBox

◦ …

15

Page 16: Глухих Михаил Игоревич mailto: glukhikh@mail

Библиотеки AWT + Swing (= JFC)◦ AWT (1995 год)

Поддержка GUI через peer-интерфейсы

Метод на Java вызывает «родную» (native) функцию ОС для работы с GUI

◦ Swing (1998 год)

«Тяжёлые» компоненты ~ как в AWT

«Лёгкие» компоненты = напрямую не связаны с API операционной системы

Кросс-платформенная архитектура = приложение одинаково выглядит везде

16

Page 17: Глухих Михаил Игоревич mailto: glukhikh@mail

heavyweight component: всегда имеет привязанное к нему окно ОС◦ Любой наследник Component, но не JComponent

lightweight component: переиспользуетокно ОС ближайшего «тяжелого» родителя◦ Любой наследник JComponent

17

Page 18: Глухих Михаил Игоревич mailto: glukhikh@mail

Container (bold are heavy-weight!)◦ JFrame -> Frame

◦ JDialog -> Dialog

◦ JWindow, JApplet

◦ JComponent

JPanel

JLabel

JButton

JComboBox

18

Page 19: Глухих Михаил Игоревич mailto: glukhikh@mail

Container◦ Window

JWindow

Frame

JFrame

Dialog

JDialog

◦ Panel

Applet

JApplet

19

Page 20: Глухих Михаил Игоревич mailto: glukhikh@mail

Библиотеки AWT + Swing (= JFC)

Библиотека JavaFX◦ Создана в 2007-2008, изначально в виде языка

JavaFX Script

◦ Вошла в JRE / JDK в 2014

◦ Не только Desktop, но и Web

◦ Считается более современной и продвинутой

20

Page 21: Глухих Михаил Игоревич mailto: glukhikh@mail

Зависит от версии JDK◦ 1.8, 9, 10 = работает из коробки (часть JDK)

◦ 11+ = нужна Maven/Gradle-зависимость, или загруженный Jar-файл (библиотека)

21

Page 22: Глухих Михаил Игоревич mailto: glukhikh@mail

Библиотеки AWT + Swing (= JFC)

Библиотека JavaFX◦ Организация на основе Scene Tree (по сути дела

это дерево компонентов, в JavaFX - узлов)

◦ Графические примитивы входят в дерево узлов

◦ Нет выделенной функции отрисовки

22

Page 23: Глухих Михаил Игоревич mailto: glukhikh@mail

Control◦ Button

◦ CheckBox

◦ List

Shape◦ Circle

◦ Rectangle

◦ Polygon

23

Page 24: Глухих Михаил Игоревич mailto: glukhikh@mail

Библиотеки AWT + Swing (= JFC)

Библиотека JavaFX

Android SDK◦ Разработка под ОС Android, 2009 год (v1)

◦ 2017 год (v26)

◦ Сейчас (2021 год) уже v31

24

Page 25: Глухих Михаил Игоревич mailto: glukhikh@mail

Библиотеки 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

Page 26: Глухих Михаил Игоревич mailto: glukhikh@mail

Всё, что есть для 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

Page 27: Глухих Михаил Игоревич mailto: glukhikh@mail

27

Page 28: Глухих Михаил Игоревич mailto: glukhikh@mail

28

Все, что требуется сделать - создать окно Frame, задать его размеры setSize, отобразить его на экране setVisible и создать обработчик закрытия окна addWindowListener

Логика создания нити обработки событий зашита внутрь библиотеки

Page 29: Глухих Михаил Игоревич mailto: glukhikh@mail

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");

}

}

Page 30: Глухих Михаил Игоревич mailto: glukhikh@mail

30

Все делается примерно аналогично

Вместо класса Frame (AWT) используется класс JFrame (Swing)

Page 31: Глухих Михаил Игоревич mailto: glukhikh@mail

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");

}

});

}

}

Page 32: Глухих Михаил Игоревич mailto: glukhikh@mail

Создателями Swing рекомендуется вызывать конструктор главного фрейма в потоке обработки сообщений

Для этой цели служит метод SwingUtilities.invokeLater(runnable);

Runnable – интерфейс "запускаемый" с одним методом run

32

Page 33: Глухих Михаил Игоревич mailto: glukhikh@mail

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")

);

}

}

Page 34: Глухих Михаил Игоревич mailto: glukhikh@mail

Application

Stage

Scene / SceneGraph

Nodes

+ [tornadofx]◦ [App]

◦ View

34

Page 35: Глухих Михаил Игоревич mailto: glukhikh@mail

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

Page 36: Глухих Михаил Игоревич mailto: glukhikh@mail

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

Page 37: Глухих Михаил Игоревич mailto: glukhikh@mail

37

Рассмотрены◦ Основные концепции GUI

Далее◦ Создание приложений

◦ …

Вопросы?