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

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

Upload: others

Post on 25-Aug-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

Page 2: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

2

Page 3: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

решает её

3

Page 4: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

решает её

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

4

Page 5: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

решает её

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

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

5

Page 6: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

решает её

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

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

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

6

Page 7: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

7

Page 8: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

8

начало

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

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

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

выход?

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

конец

да

нет

Page 9: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

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

9

Page 10: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

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

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

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

?

10

Page 11: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

11

Page 12: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

12

Page 13: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

13

Page 14: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

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

14

Page 15: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

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

15

Page 16: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

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

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

16

Page 17: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

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

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

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

17

Page 18: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

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

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

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

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

18

Page 19: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

19

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

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

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

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

Page 20: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

Редактор форм

20

Page 21: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

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

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

◦ Поддерживается IDE и/или плагинами к ней

21

Page 22: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

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

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

◦ Поддерживается IDE и/или плагинами к ней

◦ См. https://habr.com/ru/post/305974/

22

Page 23: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

23

Page 24: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

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

24

Page 25: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

Component◦ Container

Frame

Panel

Dialog

◦ Label

◦ Button

◦ ComboBox

◦ …

25

Page 26: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

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

◦ Swing (1998 год)

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

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

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

26

Page 27: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

Container◦ JFrame -> Frame

◦ JDialog -> Dialog

◦ JWindow, JApplet

◦ JComponent

JPanel

JLabel

JButton

JComboBox

27

Page 28: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

28

Page 29: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

◦ NB: JFrame НЕ наследник JComponent (!)

29

Page 30: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

Container◦ Window

JWindow

Frame

JFrame

Dialog

JDialog

◦ Panel

Applet

JApplet

30

Page 31: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

Библиотека JavaFX

31

Page 32: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

JavaFX Script

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

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

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

32

Page 33: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

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

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

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

33

Page 34: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

Button

CheckBox

List

34

Page 35: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

Button

CheckBox

List

А также◦ Circle

◦ Rectangle

◦ Polygon

35

Page 36: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

Control◦ Button

◦ CheckBox

◦ List

Shape◦ Circle

◦ Rectangle

◦ Polygon

36

Page 37: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

Библиотека JavaFX

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

◦ 2017 год (v26.1.1)

37

Page 38: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

38

Page 39: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

Всё, что есть для Java +◦ tornadofx

DSL для JavaFX

39

Page 40: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

Всё, что есть для Java +◦ tornadofx

DSL для JavaFX

◦ anko

DSL для Android SDK

40

Page 41: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

Всё, что есть для Java +◦ tornadofx

DSL для JavaFX

◦ anko

DSL для Android SDK

DSL = Domain Specific Language (проблемно-ориентированный язык)

41

Page 42: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

42

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

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

Page 43: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

43

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 44: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

44

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

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

Page 45: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

45

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 46: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

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

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

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

46

Page 47: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

47

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 48: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

class HelloView : View("Простое окно JavaFX") {

override val root = BorderPane()

}

class HelloApp : App(HelloView::class)

fun main(args: Array<String>) {

Application.launch(

HelloApp::class.java, *args)

}

48

Page 49: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

49

Label - текстовая строка

Button - клавиша

Checkbox - пункт выбора

Choice - выпадающий список

List - постоянный список

Page 50: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

50

JLabel - текстовая строка

JButton - клавиша

JCheckBox - пункт выбора

JComboBox - выпадающий список

JList - постоянный список

Page 51: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

Label

Button

CheckBox

ComboBox

51

Page 52: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

52

Обратите внимание на отличия компонентов AWT и Swing

Page 53: Глухих Михаил Игоревич mailto: glukhikh@mailkspt.icc.spbstu.ru/media/files/2019/java/Java07.pdfgui-приложение функционирует в режиме

53

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

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

◦ …