Java Advanced Интерфейс пользователя Часть 1
2 СПбГУ ИТМО Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Содержание 1.Компоненты и контейнеры 2.Окна верхнего уровня 3.Компоновщики 4.Примеры компонент 5.Обрамление 6.Swing и потоки 7.Заключение
3 СПбГУ ИТМО Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Интерфейс пользователя Платформозависимый интерфейс AWT Пакеты java.awt.* Платформонезависимый интерфейс Swing Пакеты javax.swing.*
Компоненты и контейнеры Часть 1
5Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Компоненты Части интерфейса пользователя, не содержащие других компонентов JLabel – метка JButton – кнопка JMenuItem – элемент меню JTextArea – редактор текста
6Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Контейнеры Части интерфейса пользователя, содержащие другие компонентов JPanel – панель JFrame – окно приложения JDialog – диалоговое окно JSrollPane – область с полосой прокрутки
7Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Возможности компонентов Генерация событий Обработка ввода пользователя Рамки Отрисовка в ручную Поддержка Drag & Drop Компановка …
8Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Тяжело- и легковесные компоненты Тяжеловесные (heavyweight) компоненты Отрисовываются операционной системой Большинство AWT-компонент Легковесные (lightweight) компоненты Отрисовываются java-кодом Все Swing-компоненты, кроме окон верхнего уровня Тяжеловесные компоненты всегда отрисовываются поверх легковесных
9Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Пример: кнопки на панели JPanel panel = new JPanel(new FlowLayout()); panel.add(new JButton(" e=mc 2 ")); panel.add(new JButton("Button 2")); panel.add(new JButton("Button 3")); panel.add(new JButton("Long-Named Button 4")); panel.add(new JButton("5"));
Окна верхнего уровня Часть 2
11Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Типы окон Окно приложения Класс JFrame Диалоговое окно Класс JDialog Окно апплета Класс JApplet Вложенное окно Класс JInternalFrame
12Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Структура окна Методы getXXXPane() – возвращает панель setXXXPane() – устанавливает панель
13Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Окна приложения Класс JFrame Конструкторы JFrame(title) Свойства title – заголовок jMenuBar – меню iconImage – иконка окна
14Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Закрытие окон Метод setDefaultCloseOperation(operation) – установить действие при закрытии окна HIDE_ON_CLOSE DO_NOTHING_ON_CLOSE DISPOSE_ON_CLOSE EXIT_ON_CLOSE (JFrame)
15Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Пример: окно с кнопками JFrame frame = new JFrame("SimpleDemo"); // Добавление панели к окну frame.getContentPane().add(panel); frame.pack(); // подгонка размера frame.setVisible(true); // Показать пользователю
16Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Меню Основное меню Класс JMenuBar Раскрывающееся меню Класс JMenu Элементы меню Класс JMenuItem – простой Класс JCheckBoxMenuItem – помечаемый Класс JRadioButtonMenuItem – один из Класс JSeparator – разделитель
17Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Пример: окно с меню (2) frame.setJMenuBar(createMainMenu()); … public static JMenuBar createMainMenu() { JMenuBar mainMenu = new JMenuBar(); mainMenu.add(createFileMenu()); mainMenu.add(createTestMenu()); mainMenu.add(createHelpMenu()); return mainMenu; }
18Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Пример: окно с меню (2) public static JMenu createFileMenu() { JMenu fileMenu = new JMenu("File"); fileMenu.setMnemonic(KeyEvent.VK_F); fileMenu.add(new JMenuItem("Open")); fileMenu.add(new JMenuItem("Save")); fileMenu.add(new JSeparator()); fileMenu.add(new JMenuItem("Exit")); return fileMenu; }
19Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Пример: окно с меню (3)
20Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Работа с диалогами Класс JDialog Конструкторы JDialog(owner, title, modal) Свойства String title -- заголовок boolean modal – модальность
21Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Стандартные диалоги Класс JOptionPane Методы showConfirmDialog(…) – да/нет/отмена showInputDialog(…) – ввод текста showMessageDialog(…) – информация showOptionDialog(…) – выбор из списка Параметры parentComponent – родительская компонента message – сообщение optionType – набор кнопок messageType – вид иконки
Компоновщики Часть 3
23Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Компоновщики Размещают компоненты внутри контейнера Интерфейс java.awt.LayoutManager
24Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Работа компоновщика Разместить компоненты так, что бы удовлетворялись рекомендации Рекомендации по размеру Dimension minimumSize – минимальный Dimension preferredSize – наилучший Dimension maximumSize -- максимальный
25Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Применение компоновщиков JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add(new JButton( "1), BorderLayout.PAGE_START ); panel.add(new JButton( "1), BorderLayout.PAGE_END );
26Georgiy KorneevJava Advanced / Интерфейс пользователя 1 FlowLayout Компоненты выкладываются одна за другой, с переносом строк Свойства alignment – выравнивание LEADING, CENTER, TRAILING vgap / hgap – расстояние по горизонтали / вертикали
27Georgiy KorneevJava Advanced / Интерфейс пользователя 1 BorderLayout Компоненты располагаются по краям Свойства vgap / hgap – расстояние по вертикали / горизонтали
28Georgiy KorneevJava Advanced / Интерфейс пользователя 1 GridLayout Компоненты располагаются в виде таблицы Свойства rows / columns – количество строк / столбцов vgap / hgap – расстояние по вертикали / горизонтали
29Georgiy KorneevJava Advanced / Интерфейс пользователя 1 BoxLayout Выкладывает компоненты горизонтально / вертикально Конструктор BoxLayout(container, axis) PAGE_AXIS, LINE_AXIS
30Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Другие компоновщики CardLayout – помещает компоненты друг за другом GridBagLayout – помещает компоненты в гибкую таблицу SpringLayout – очень гибкий компоновщик, используется при кодогенерации
31Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Запуск компоновщика Автоматически – при изменении размера контейнера В ручную invalidate() – запросить перекомпоновку компоненты и всех ее предков revalidate() – thead-safe invalidate()
Примеры компонент Часть 4
33Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Класс JPanel Простейший контейнер Конструктор JPanel(LayoutManager) Свойства layoutManager -- компановщик
34Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Класс JLabel Метка с текстом Конструктор JLabel(text?, icon?) Свойства text – надпись на метке icon – картинка labelFor – для какой компоненты
35Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Класс JScrollPane Панель с полосами прокрутки Конструктор JScrollPane(Component?, vsbPolicy?, hsbPolicy?) _SCROLLBAR_AS_NEEDED _SCROLLBAR_NEVER _SCROLLBAR_ALWAYS
36Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Иконки Класс ImageIcon Конструктор ImageIcon(url) – загрузить по URL ImageIcon(file) – загрузить из файла Методы getIconHeight() – высота иконки getIconWidth() – ширина иконки getImage() – платформозависимый рисунок Применение frame.setIconImage(icon.getImage()) new JLable(icon);
37Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Класс JSplitPane Разделяет контейнер на две части Конструктор JSplitPane (orientation) HORIZONTAL_SPLIT VERTICAL_SPLIT Свойства leftComponent – компонента слева rightComponent – компонента справа
Обрамление Часть 5
39Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Обрамление Каждая компонента может иметь обрамление в виде рамки Пакет javax.swing.border Класс Border Метод Component.setBorder(Border)
40Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Размер обрамления Размер обрамления вычитается из размера компоненты Класс Insets Конструктор Insets(left, right, bottom, top) Поля left – отступ слева right – отступ справа bottom – отступ снизу top – отступ сверху
41Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Типы обрамлений Простые Наборные С заголовком Составные
42Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Простые обрамления Классы EmptyBorder – пустое место LineBorder – линия EtchedBorder – объемность BevelBorder – выпуклость / вдавленность
43Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Наборные обрамления Обрамление набирается из рисунка Класс MatteBorder
44Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Обрамления с заголовком Свойства justification – горизонтальное местоположение position – вертикальное местопложение Создается на основе другого обрамления Класс TitledBorder
45Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Составное обрамление Объединяет два обрамления Класс CompoundBorder Конструктор CompoundBorder(insideBorder, outsideBorder)
46Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Фабрика обрамлений Класс BorderFactory Методы create Border(properties)
Swing и потоки Часть 6
48Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Swing и потоки Обработка сообщений и перерисовка интерфейса пользователя происходят в потоке событий (EventThread) Если занять EventThread, GUI зависнет С видимыми компонентами можно оперировать только в EventThread GUI рекомендуется создавать в EventThread
49Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Видимые компоненты Компонента считается видимой, если Она добавлена к видимому контейнеру Окна считаются видимой После вызова метода pack() После вызова setVisible(true)
50Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Исполнение действий в EventThread Класс SwingUtilities Методы invokeLater(Runnable) – выполнить метод run() в EventThread invokeAndWait(Runnable) – выполнить метод run() в EventThread и дождаться окончания
Заключение Часть 7
52Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Ссылки Creating a GUI with JFC/Swing (Tutorial) // Java Foundation Classes // Swing Connection //
53 СПбГУ ИТМО Georgiy KorneevJava Advanced / Интерфейс пользователя 1 Вопросы