Язык Java и разработка Java-приложений

122
Язык Java и разработка Java-приложений Библиотека Eclipse Standard Widget Toolkit Разработка интерфейса пользователя на примере программы «Блокнот настольных игр». Романов Владимир Юрьевич, Московский Государственный Университет им. М.В.Ломоносова Факультет Вычислительной Математики и Кибернетики [email protected], [email protected]

Transcript of Язык Java и разработка Java-приложений

Page 1: Язык Java и разработка Java-приложений

Язык Java

и разработка Java-приложений

Библиотека Eclipse Standard Widget Toolkit

Разработка интерфейса пользователя

на примере программы «Блокнот настольных игр».

Романов Владимир Юрьевич,

Московский Государственный Университет им. М.В.Ломоносова

Факультет Вычислительной Математики и Кибернетики

[email protected],

[email protected]

Page 2: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

2

Настольные игры

https://www.chessprogramming.org/Games

Page 3: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

3

Шахматы

Page 4: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

4

Шашки

Page 5: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

5

Китайские шахматы

Page 6: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

6

Викинги

Page 7: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

7

Шахматы Тамерлана

Page 8: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

8

Реверси

Page 9: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

9

Уголки

Page 10: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

10

Практикум по языку Java Возможные темы практикума

Реализация правил игры для новой настольной игры

(например, с сайта https://www.chessprogramming.org/Games)

Японские шахматы

Реализация новых алгоритмов игры для уже существующих

игр (Незнайка, Винни Пух, Сова, …)

Реализация интерфейса пользователя с помощью новой

библиотеки

Swing

JavaFX

Google Web Toolkit (клиент и сервер оба написаны на Java)

Расширение интерфейса пользователя

Организация соревнований между алгоритмами (матчи, турниры, …)

Хранение архивов партий и соревнований в БД (реляционных (JDBC),…)

Редактор начальных позиций игр

Page 11: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

11

Проектирование архитектуры. Выделение уровней в настольных играх

Идентификация пакетов верхнего уровня

Page 12: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

12

Проектирование архитектуры. Ядро настольных игр

Page 13: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

13

Проектирование архитектуры. Ядро настольных игр. Ходы настольных игр

Page 14: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

14

Проектирование архитектуры. Ядро настольных игр. Игроки настольных игр

Page 15: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

15

Проектирование архитектуры Зависимости между пакетами.

Идентификация зависимостей между пакетами.

Page 16: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

16

Проектирование классов Классы-фигуры в шахматной программе

Page 17: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

17

Проектирование классов Классы-ходы в шахматной программе

Page 18: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

18

Проектирование интерфейса пользователя Интерфейс пользователя для игры на доске.

Page 19: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

19

Проектирование интерфейса пользователя Обозреваемый (доска) и обозреватели

Page 20: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

20

Проектирование интерфейса пользователя Обозреватели доски

ScorePanel GameBoard MovesJornal

Page 21: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

21

Блокнот игр. Шахматы.

Подсветка последнего хода

Page 22: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

22

Блокнот игр. Рендзю.

Подсветка последнего хода

Page 23: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

23

Назначение SWT

Standard Widget Toolkit: Инструмент для

разработки интерфейса пользователя

Разработан в IBM

Используется в проектах www.eclipse.org

Эффективный

Переносимый

Низкий уровень реализации: есть доступ к

возможностям операционной системы

Сайт проекта: eclipse.org/swt

Page 24: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

24

Элементы библиотеки SWT

Сайт проекта: https://www.eclipse.org/swt/widgets/

Page 25: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

25

Фрагменты кода для использования

элементов библиотеки SWT

Сайт проекта: https://www.eclipse.org/swt/snippets/

Page 26: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

26

Иерархия управляющих элементов (widgets).

Page 27: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

27

SWT. Основные классы библиотеки:

Класс Display

Представляет рабочее место (workstation)

мониторы, клавиатуру, мышку

Отвечает за распределение событий в

цикле событий (event loop)

Содержит список окон верхнего уровня

(Shells)

Содержит список мониторов (Monitors)

Page 28: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

28

SWT. Основные классы библиотеки:

Класс Shell

Представляет окно на экране

Это корень дерева состоящего из:

Composites (составной элемент)

Controls (управляющий элемент)

Shell – потомок класса Widget

Page 29: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

29

SWT. Вид класса Shell на экране.

Окно с заголовком Chess Notebook

Page 30: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

30

Блокнот игр. Реверси.

Подсветка последнего хода

Page 31: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

31

SWT. Основные классы библиотеки:

Класс Composite

Composite (составной элемент) -

управляющий элемент (control) который

может состоять их других составных

элементов и управляющий элементов

Composite – потомок класса Widget

Page 32: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

32

SWT. Основные классы библиотеки:

Класс Control

Control (управляющий элемент) –

представляет легковесный (heavyweight)

элемент операционной системы

Примеры управляющих элементов:

Button, Label, Text, Tree, Shell, Composite,

Control – потомок класса Widget

Page 33: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

33

SWT. Цикл событий (event loop)

В SWT, цикл событий должен быть явно закодирован в приложении

Цикл событий постоянно читает и распределяет события интерфейса пользователя поступающие из операционной системы и «отдает» CPU когда событий нет.

Цикл событий завершается когда завершается приложение. Обычно когда закрывается окно.

Page 34: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

34

SWT. Пример цикла событий

while(!shell.isDisposed()){

if(!display.readAndDispatch())

display.sleep ();

}

Page 35: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

35

Шахматы. Минимальное «приложение»

import org.eclipse.swt.widgets.*;

public class Chess {

public static void main(String[] args) {

final Display display = new Display();

final Shell shell = new Shell(display);

shell.setSize(600, 500);

shell.setText("Chess Notebook");

shell.open();

while (!shell.isDisposed()) {

if (!display.readAndDispatch())

display.sleep();

}

display.dispose();

} // main

} // class Chess

Page 36: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

36

Шахматы. Создание рабочего места

Files | Switch Workspace | Other …

Page 37: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

37

Шахматы. Рабочее место. Wellcome

Нажать здесь

Page 38: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

38

Шахматы. Workbench (Станок ??)

Page 39: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

39

Шахматы. Создание нового проекта

Page 40: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

40

Шахматы. Создание проекта

Ввести имя проекта

ChessSWT

Page 41: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

41

Шахматы. Создание проекта

Page 42: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

42

Шахматы. Создание проекта

Page 43: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

43

Шахматы. Создание “главного” класса

Files | New | Class …

Ввести имя класса

Chess

Попросить создать

метод main()

Page 44: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

44

Шахматы. Сгенерированный «главный»

класс Chess

Page 45: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

45

Шахматы. Минимальное приложение

import org.eclipse.swt.widgets.*;

public class Chess {

public static void main(String[] args) {

final Display display = new Display();

final Shell shell = new Shell(display);

shell.setSize(600, 500);

shell.setText("Chess Notebook");

shell.open();

while (!shell.isDisposed()) {

if (!display.readAndDispatch())

display.sleep();

}

display.dispose();

} // main

} // class Chess

Page 46: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

46

Шахматы. «Минимальные» шахматы в

окне редактора

Page 47: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

47

Шахматы. Горячие клавиши редактора

Ctrl + Shift + L

показать список всех «горячих клавиш»

Page 48: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

48

Шахматы. Открытие исходных текстов

горячей клавишей F3

F3

Page 49: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

49

Шахматы. Открытие иерархии

наследования горячей клавишей F4

F4

Page 50: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

50

Шахматы. «Минимальные» шахматы на

экране

Нажать “запуск в отладочном режиме” F11

Page 51: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

51

Пиктограмма приложения

import org.eclipse.swt.widgets.*;

public class Chess {

public static void main(String[] args) {

final Display display = new Display();

ChessImages.load(display);

final Shell shell = new Shell(display);

shell.setSize(600, 500);

shell.setText("Chess Notebook");

shell.setImage(ChessImages.iconChessNotebook);

shell.open();

while (!shell.isDisposed()) {

if (!display.readAndDispatch())

display.sleep();

}

display.dispose();

} // main

} // class Chess

Page 52: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

52

Шахматы. Создание класса ChessImages

в режиме «исправления ошибок»

Нажатие мышью

или

CTRL+1

Page 53: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

53

Шахматы. Варианты «исправления

ошибки» предлагаемые в среде Eclipse

Page 54: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

54

Шахматы. Создание метода load

в классе ChessImages

Page 55: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

55

Создание поля iconChessNotebook

в классе ChessImages

Page 56: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

56

Сгенерированный класс ChessImages

package chess.ui;

import org.eclipse.swt.graphics.Image;

import org.eclipse.swt.widgets.Display;

public class ChessImages {

public static Image iconChessNotebook;

public static void load(Display display) {

iconChessNotebook = new Image(display,

ChessImages.class.getResourceAsStream("ChessNoteBook.ico"));

}

}

Файл ChessNoteBook.ico должен находится в той же папке,

что и файл ChessImages.class

Page 57: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

57

Шахматы. Блокнот с пиктограммой

Пиктограмма

ChessNoteBook.ico

Page 58: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

58

SWT. Пакеты библиотеки

Пакеты библиотеки SWT на языке Java

org.eclipse.swt

org.eclipse.swt.widgets

org.eclipse.swt.graphics

org.eclipse.swt.events

org.eclipse.swt.layout

org.eclipse.swt.dnd

org.eclipse.swt.printing

org.eclipse.swt.program

org.eclipse.swt.accessibility

org.eclipse.swt.custom

org.eclipse.swt.browser

org.eclipse.swt.awt

org.eclipse.swt.internal

Page 59: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

59

Класс SWT.

Содержит все константы библиотеки

SWT.PUSH, SWT.RADIO

SWT.Selection

Содержит универсальные методы

getPlatform()

getVersion()

error()

Page 60: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

60

Иерархия управляющих элементов (widgets).

Page 61: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

61

Конструкторы и стили управляющих

элементов.

Управляющий элемент (widget) всегда имеет предка

Вид типичного конструктора: Widget(Composite parent, int style)

Стили задаются с помощью констант из класса SWT

Примеры:

new Label(shell, SWT.NONE);

Button push = new Button(shell, SWT.PUSH);

Button radio = new Button(parent, SWT.RADIO);

Text text = new Text(group, SWT.SINGLE | SWT.BORDER);

Исключение. Класс Shell всегда имеет предка Shell или Display

Shell shell = new Shell(display, SWT.SHELL_TRIM);

Shell dialog = new Shell(shell, SWT.DIALOG_TRIM);

Page 62: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

62

Класс Widget.

Абстрактный суперкласс для всех элементов интерфейса пользователя

Создается с помощью конструкторов (без фабрик)

При создании занимает ресурсы операционной системы

Ресурсы освобождаютcя программно с помощью метода dispose()

Уведомляет слушателей когда происходят с этим управляющим

элементом происходят события

Позволяет хранить специфичные для приложения данные

setData(Object)

setData(String, Object)

Событие

Dispose

Page 63: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

63

Освобождение ресурсов графики и

управляющих элементов.

Вы должны явно освобождать объекты потребляющие ресурсы:

Класс Widget и его подклассов

Классы Color, Cursor, Font, GC, Image, Region,

Класс Device и его подклассы (Display, Printer)

Правило 1: “Если вы создали его, вы его освобождаете”

Программист должен освободить шрифт:

Font font = new Font (display, "Courier", 10, SWT.NORMAL);

font.dispose ();

Программист не должен освободить шрифт:

Font font = control.getFont();

Page 64: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

64

Освобождение ресурсов управляющих

элементов их предками.

Правило 2: “Освобождение предка освобождает его потомков “

shell.dispose(); // Освобождает всех потомков окна

menu.dispose(); // Освобождает все элементы меню

tree.dispose(); // Освобождает все элементы дерева

Заметим, что:

control.dispose();

menuItem.dispose();

Освобождает элемент меню созданный с помощью setMenu(menu);

Page 65: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

65

Класс Control

Абстрактный суперкласс для всех легковесных (heavyweight)

элементов интерфейса пользователя

Стили

BORDER, LEFT_TO_RIGHT, RIGHT_TO_LEFT

События

FocusIn, FocusOut

KeyDown, KeyUp

Traverse

MouseDown, MouseUp, MouseDoubleClick

MouseEnter, MouseExit, MouseMove, MouseHover

Move, Resize

Paint

Help

Page 66: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

66

Класс Shell

Конструкторы

new Shell(display, SWT.SHELL_TRIM);

new Shell(shell, SWT.DIALOG_TRIM);

Стили

BORDER, CLOSE, MIN, MAX,

NO_TRIM, RESIZE, TITLE

APPLICATION_MODAL, MODELESS,

PRIMARY_MODAL, SYSTEM_MODAL

События

Close, Activate, Deactivate, Iconify, Deiconify

Характерные методы

open(), close(), setActive()

Замечания

Предок для shell верхнего уровня всегда Display

Предок для shell - диалогового окна всегда Shell верхнего уровня

Page 67: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

67

Класс Composite

Конструкторы

new Composite(parent, SWT.NONE);

Стили

NO_BACKGROUND, NO_FOCUS,

NO_MERGE_PAINTS, NO_REDRAW_RESIZE,

NO_RADIO_GROUP

События

Close, Activate, Deactivate, Iconify, Deiconify

Характерные методы

getChildren()

setLayout(Layout), layout(boolean)

setTabList(Control[])

Замечания

может иметь потомков – управляющие элементы (controls)

может использовать класс Layout для задания положения потомков

используется как суперкласс для создания управляющих элементов (widgets)

пользователя

Page 68: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

68

Класс Canvas

Конструкторы

new Canvas(parent, SWT.NONE);

Стили

NO_BACKGROUND, NO_FOCUS,

NO_MERGE_PAINTS, NO_REDRAW_RESIZE

Характерные методы

scroll(int, int, int, int, int, int, boolean)

setCaret(Caret)

Замечания

Обычно используется как «чистый лист бумаги» для рисования

графики

используется как суперкласс для создания управляющих элементов

(widgets) пользователя

Page 69: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

69

Класс TabFolder

Конструкторы

new TabFolder(parent, SWT.TOP);

Стили

SWT.TOP , SWT.BOTTOM, SWT.LEFT, SWT.RIGHT

Характерные методы

setSelection(int, boolean)

setSelection(TabItem)

TabItem getSelection()

int getSelectionIndex()

Замечания

используется как «книга» с закладками

Page 70: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

70

Класс TabItem

Конструкторы

new TabItem(parent, SWT.NONE);

Стили

Унаследованные от родителей

Характерные методы

setControl(Control)

setImage(Image)

setText(String)

setToolTipText(String)

Замечания

используется как закладка в «книге»

Page 71: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

71

Шахматы. Шахматная доска – теперь как

закладка в «книге» игр

public static void main(String[] args) {

final Display display = new Display();

ChessImages.load(display);

final Shell shell = new Shell(display);

shell.setSize(600, 500);

shell.setText("Chess Notebook");

shell.setImage(ChessImages.iconChessNotebook);

final TabFolder gamesFolder = new TabFolder(shell, SWT.TOP);

TabItem chessItem = new TabItem(gamesFolder, SWT.NULL);

chessItem.setText("Шахматы");

chessItem.setControl( new ChessBoard(gamesFolder, SWT.NONE) );

// …

} // main Вставка шахматной

доски в закладку

Page 72: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

72

Шахматы. Шахматы – пиктограмма для

закладки в блокноте игр

public static void main(String[] args) {

// …

final TabFolder gamesFolder = new TabFolder(shell, SWT.TOP);

final Image chessTabImage = new Image(display,

ChessImages.imageKnightBlack.getImageData().scaledTo(20, 20) );

TabItem chessItem = new TabItem(gamesFolder, SWT.NULL);

chessItem.setText("Шахматы");

chessItem.setImage(chessTabImage);

chessItem.setControl( new ChessBoard(gamesFolder, SWT.NONE) );

// …

} // main

Масштабирование

рисунка

Пиктограмма для

закладки шахмат в

блокноте клеточных игр

Page 73: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

73

Шахматы. Создание класса для

шахматной доски с помощью wizard

Ctrl + 1 когда «каретка» в тексте ChessBoard

Page 74: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

74

Шахматы. Создание класса для

шахматной доски с помощью wizard

Всплывающая подсказка когда мышка над текстом ChessBoard

Page 75: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

75

Шахматы. Создание класса для

шахматной доски с помощью wizard

Page 76: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

76

Шахматы. Класс ChessBoard создан

Page 77: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

77

Шахматы. Создание конструктора класса

ChessBoard с помощью wizard

Ctrl + 1 когда «каретка» в тексте ChessBoard

Page 78: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

78

Шахматы. Конструктор класса ChessBoard

создан

Page 79: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

79

Шахматы. Показывается только пустое

поле для рисования доски

Page 80: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

80

Шахматы. Рисование рамки доски

Page 81: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

81

Шахматы. Вставка импорта неизвестного

класса или интерфейса

Ctrl + Shift + O для вставки импорта с помощью wizard

Page 82: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

82

Шахматы. Класс ChessBoard реализует

интерфейс PaintListener

Ctrl + Shift + O добавление нереализованных методов с помощью wizard

Page 83: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

83

Шахматы. Добавлена реализация методов

интерфейса PaintListener

Page 84: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

84

Шахматы. Рисование рамки по границам

доски

public void paintControl(PaintEvent e) {

Rectangle clientArea = getClientArea();

e.gc.drawRectangle(0, 0, clientArea.width - 1, clientArea.height - 1);

}

Page 85: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

85

Шахматы. Рисование рамки по границам

доски слушателем события Paint

Page 86: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

86

Шахматы. Рамка доски

Page 87: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

87

Шахматы. Отрисовка клеток доски

public void paintControl(PaintEvent e) {

Rectangle clientArea = getClientArea();

GC gc = e.gc;

for (int v = 0; v < nV; v++)

for (int h = 0; h < nH; h++) {

int squareWidth = getClientArea().width / nV;

int squareHeight = getClientArea().height / nH;

boolean isWhiteSquare = ((v + h) % 2 == 0);

Color squareColor = isWhiteSquare ? new Color(null, 255, 255,255) : new Color(null, 0, 192, 0);

gc.setBackground(squareColor);

gc.fillRectangle(v * squareWidth, h * squareHeight, squareWidth, squareHeight);

gc.setForeground(new Color(null, 0, 0, 0));

gc.drawRectangle(v * squareWidth, h * squareHeight, squareWidth, squareHeight);

} // for

e.gc.drawRectangle(0, 0, clientArea.width - 1, clientArea.height - 1);

} // paintControl

Page 88: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

88

Шахматы. Создание поля (field) для

необъявленых nV и nH

Page 89: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

89

Шахматы. Отрисовка клеток доски

Page 90: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

90

Шахматы. Клетки щахматной доски

Page 91: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

91

Рефакторинг программы.

Разновидности досок для игр

Page 92: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

92

Рефакторинг. Вынос универсальных

полей и методов в базовый класс

Предпосылки

Размерность доски - поля nH и nV общие для всех клеточных игр

Алгоритм рисования в цикле всех клеток доски универсален

Page 93: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

93

Доска для азиатских игр.

Клетки доски для игр го и рендзю

Фигуры

располагаются на

пересечении линий

Цель – преобразовать программу для рисования досок

различных настольных игр

Page 94: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

94

Рефакторинг.

Инструменты рефакторинга

Page 95: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

95

Контексто-зависимый рефакторинг.

Клавиши Alt + Shift + T (Eclipse)

Преобразования применимые к классу ChessBoard

Page 96: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

96

Контексто-зависимый рефакторинг.

Клавиши Alt + Shift + T

Преобразования применимые к методу paintControl

Page 97: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

97

Контексто-зависимый рефакторинг.

Клавиши Alt + Shift + T

Преобразования применимые к выделенному тексту

Page 98: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

98

Шахматы. Отрисовка клеток доски

public void paintControl(PaintEvent e) {

Rectangle clientArea = getClientArea();

GC gc = e.gc;

for (int v = 0; v < nV; v++)

for (int h = 0; h < nH; h++) {

int squareWidth = getClientArea().width / nV;

int squareHeight = getClientArea().height / nH;

boolean isWhiteSquare = ((v + h) % 2 == 0);

Color squareColor = isWhiteSquare ? new Color(null, 255, 255,255) : new Color(null, 0, 192, 0);

gc.setBackground(squareColor);

gc.fillRectangle(v * squareWidth, h * squareHeight, squareWidth, squareHeight);

gc.setForeground(new Color(null, 0, 0, 0));

gc.drawRectangle(v * squareWidth, h * squareHeight, squareWidth, squareHeight);

} // for

e.gc.drawRectangle(0, 0, clientArea.width - 1, clientArea.height - 1);

} // paintControl

Алгоритм рисования клетки

шахматной доски вынесем в

отдельный метод

Page 99: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

99

Рефакторинг. Выделение метода.

Клавиши ALT + Shift + M

3. напечатать

имя метода

1. Сначала

выделение

текста

2. Потом открыть

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

ALT + Shift + M

Page 100: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

100

Шахматы. Выделенный метод рисования

клетки шахмат (двухцветная доска)

private void drawSquare(GC gc, int v, int h) {

int squareWidth = getClientArea().width / nV;

int squareHeight = getClientArea().height / nH;

boolean isWhiteSquare = ((v + h) % 2 == 0);

Color squareColor = isWhiteSquare

? new Color(null, 255, 255,255) : new Color(null, 0, 192, 0);

gc.setBackground(squareColor);

gc.fillRectangle(v * squareWidth, h * squareHeight, squareWidth, squareHeight);

gc.setForeground(new Color(null, 0, 0, 0));

gc.drawRectangle(v * squareWidth, h * squareHeight, squareWidth, squareHeight);

}

Page 101: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

101

Шахматы. Вызов выделенного метода

в универсальном методе рисования доски

public void paintControl(PaintEvent e) {

Rectangle clientArea = getClientArea();

GC gc = e.gc;

for (int v = 0; v < nV; v++)

for (int h = 0; h < nH; h++) {

drawSquare(gc, v, h);

}

gc.drawRectangle(0, 0, clientArea.width - 1, clientArea.height - 1);

}

Page 102: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

102

Рефакторинг. Вынос универсальных

полей и методов в базовый класс

Предпосылки

Размерность доски - поля nH и nV общие для всех клеточных игр

Алгоритм рисования в цикле всех клеток доски универсален

Page 103: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

103

Рефакторинг. Создание абстактного

класса GameBoard

1. Сначала

выделение имени

2. Переход к меню

допустимых рефакторингов

ALT + Shift + Т

3. Выбор

рефакторинга

Extract Superclass

Page 104: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

104

Рефакторинг. Создание абстрактного

класса GameBoard

1. Ввод имени

суперкласса

2. Выбор

переносимых в

суперкласс полей и

методов

3. Выбор действия

умалчиваемое

действие extract

Page 105: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

105

Рефакторинг. Создание абстрактного

метода в классе GameBoard

Выбор действия

Page 106: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

106

Шахматы. Выделенный суперкласс

GameBoard

public abstract class GameBoard extends Canvas {

protected int nV;

protected int nH;

protected abstract void paintSquare(GC gc, int v, int h);

public GameBoard(Composite parent, int style)

{ super(parent, style); }

public void paintControl(PaintEvent e) {

Rectangle clientArea = getClientArea();

GC gc = e.gc;

for (int v = 0; v < nV; v++)

for (int h = 0; h < nH; h++)

paintSquare(gc, v, h);

e.gc.drawRectangle(0, 0, clientArea.width - 1, clientArea.height - 1);

} // paintControl

}

Предок

выделенного

суперкласса

Переопределяемый

метод paintSquare

Page 107: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

107

Шахматы. ChessBoard – потомок

выделенного суперкласса GameBoard

import org.eclipse.swt.events.MouseEvent;

import org.eclipse.swt.events.MouseListener;

import org.eclipse.swt.graphics.Color;

import org.eclipse.swt.graphics.Cursor;

import org.eclipse.swt.graphics.GC;

import org.eclipse.swt.graphics.Image;

import org.eclipse.swt.graphics.ImageData;

import org.eclipse.swt.widgets.Composite;

import chess.ChessImages;

public class ChessBoard extends GameBoard {

// …

}

Потомок

выделенного

суперкласса

Page 108: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

108

Перенос реализации интерфейса

PaintListener в базовый класс

Page 109: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

109

Создание класса AsiaBoard - потомка

класса GameBoard (wizard)

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

пакете chess.ui

Page 110: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

110

Создание класса AsiaBoard - потомка

класса GameBoard (wizard)

Задание имени

класса

Задание имени

базового класса

Page 111: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

111

Создан класс AsiaBoard

Page 112: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

112

Создание конструктора класса AsiaBoard

Page 113: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

113

Конструктор класса AsiaBoard cоздан

Page 114: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

114

Шахматы. AsiaBoard – потомок суперкласса

GameBoard (1)

package chess.ui;

import org.eclipse.swt.graphics.GC;

import org.eclipse.swt.widgets.Composite;

public class AsiaBoard extends GameBoard {

public AsiaBoard(Composite parent, int style) {

super(parent, style);

}

@Override

protected void drawSquare(GC gc, int v, int h) {

// TODO Auto-generated method stub

}

}

Потомок

суперкласса

GameBoard

Page 115: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

115

Шахматы. AsiaBoard – потомок суперкласса

GameBoard (2)

@Override

protected void drawSquare(GC gc, int v, int h) {

int squareWidth = getClientArea().width / nV;

int squareHeight = getClientArea().height / nH;

gc.setBackground(new Color(null, 255, 255,0) );

gc.fillRectangle(v * squareWidth, h * squareHeight, squareWidth, squareHeight);

int x = v * squareWidth + squareWidth/2;

int y = h * squareHeight + squareHeight/2;

if (v != 0) gc.drawLine(x, y, x - squareWidth/2, y);

if (v != nV-1) gc.drawLine(x, y, x + squareWidth/2, y);

if (h != 0) gc.drawLine(x, y, x, y - squareHeight/2);

if (h != nH-1) gc.drawLine(x, y, x, y + squareHeight/2);

}

}

Реализация

абстрактного метода

GameBoard.drawSquare

Page 116: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

116

Блокнот игр. Доска для игр:

Шахматы, Рендзю

Page 117: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

117

Блокнот игр. Доска для игр:

Шахматы, Рендзю

Page 118: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

118

Блокнот игр. Игры на шахматной доске

final TabFolder gamesFolder = new TabFolder(shell, SWT.TOP);

final Image chessTabImage = new Image(display,

ChessImages.imageKnightBlack.getImageData().scaledTo(20, 20));

TabItem chessItem = new TabItem(gamesFolder, SWT.NULL);

chessItem.setText("Шахматы");

chessItem.setImage(chessTabImage);

chessItem.setControl(new ChessBoard(gamesFolder, SWT.NONE));

final Image checkersTabImage = new Image(display,

ChessImages.imageCheckersNotebook.getImageData().scaledTo(20, 20));

TabItem checkersItem = new TabItem(gamesFolder, SWT.NULL);

checkersItem.setText("Шашки");

checkersItem.setImage(checkersTabImage);

checkersItem.setControl(new ChessBoard(gamesFolder, SWT.NONE));

Блокнот

Page 119: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

119

Блокнот игр. Игры на «японской» доске

final Image renjuTabImage = new Image(display,

ChessImages.imageRenjuNotebook.getImageData().scaledTo(20, 20));

TabItem renjuItem = new TabItem(gamesFolder, SWT.NULL);

renjuItem.setText("Рендзю");

renjuItem.setImage(renjuTabImage);

renjuItem.setControl(new AsiaBoard(gamesFolder, SWT.NONE));

final Image reversiTabImage = new Image(display,

ChessImages.imageReversiNotebook.getImageData().scaledTo(20, 20));

TabItem reversiItem = new TabItem(gamesFolder, SWT.NULL);

reversiItem.setText("Реверси");

reversiItem.setImage(reversiTabImage);

reversiItem.setControl(new AsiaBoard(gamesFolder, SWT.NONE));

Page 120: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

120

Блокнот игр. Доска для игры

Рендзю, Го, Сянци (китайские шахматы)

Page 121: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

121

Проектирование архитектуры. Выделение уровней в настольных играх

Идентификация пакетов верхнего уровня

Page 122: Язык Java и разработка Java-приложений

МГУ им. М.В.Ломоносова. Факультет ВМК. Романов Владимир Юрьевич ©2021

122

Проектирование архитектуры. Классы пакета game.core