Портянкин И. Swing
.pdfИван Портянкин
Swing: Эффектные пользовательские интерфейсы
Издательство «Лори»
Swing: Эффектные пользовательские интерфейсы
издание 2-ое
♥ Иван Портянкин
Верстка Глазова Т.
♥ Издательство “Лори”, 2011
Изд. № : OAI (03)
ЛР № : 07612 30.09.97 г. ISBN 978-5-85582-305-9
Подписано в печать 20.09.2011 Формат 70 x 100/16 Бумага газетная Гарнитура Баскервиль Печать офсетная Печ. л. 24.5 Тираж 1000 Заказ № Цена договорная
Издательство “Лори” 123100, Москва, Шмитовский пер., д. 13/6, стр. 1 (пом. ТАРП ЦАО)
телефон для оптовых покупателей; (499)2560983 размещение рекламы; (499)2590162 www.lory-press.ru
Отпечатано в типографии ООО “Тиль-2004” Москва, ул. Электрозаводская д. 21
Содержание |
|
Введение.............................................................................................................. |
ix |
Глава 1. Основные концепции .......................................................................... |
1 |
В начале было... AWT................................................................................. |
2 |
Компоненты Swing — это легковесные компоненты AWT ......................... |
5 |
Совместное использование компонентов AWT и Swing ............................ |
7 |
Архитектура JavaBeans.............................................................................. |
8 |
Соглашение об именах................................................................................. |
9 |
Расширенные возможности ....................................................................... |
11 |
Привязанные свойства........................................................................ |
11 |
Ограниченные свойства...................................................................... |
11 |
Индексированные свойства ................................................................ |
12 |
Редакторы свойств............................................................................. |
12 |
Описание компонента ......................................................................... |
12 |
Постоянство........................................................................................ |
13 |
Компоненты Swing — это компоненты JavaBeans ................................... |
13 |
Подключаемые внешний вид и поведение............................................. |
14 |
Архитектура MVC........................................................................................ |
15 |
Все ли так хорошо в MVC?......................................................................... |
18 |
Решение Swing — представители пользовательского интерфейса........ |
19 |
Как все работает......................................................................................... |
20 |
Управление внешним видом и поведением программы.......................... |
21 |
Специальные средства для пользователей с ограниченными |
|
возможностями......................................................................................... |
25 |
Локализация приложений........................................................................ |
26 |
Резюме ........................................................................................................................ |
26 |
Глава 2. Модель событий................................................................................. |
27 |
Наблюдатели ............................................................................................ |
28 |
Слушатели ................................................................................................ |
29 |
Схема именования событий JavaBeans ................................................. |
32 |
Стандартные события.............................................................................. |
33 |
Техника написания слушателей.............................................................. |
37 |
Адаптеры..................................................................................................... |
38 |
Каждому событию — по слушателю.......................................................... |
39 |
Внутренние классы.............................................................................. |
40 |
Быстро и грязно................................................................................... |
42 |
Диспетчеризация ........................................................................................ |
43 |
Проблема висячих ссылок ......................................................................... |
46 |
Создание собственных событий ............................................................. |
47 |
Список EventListenerList ............................................................................. |
52 |
События от мыши и волшебный метод contains().................................. |
53 |
Резюме ...................................................................................................... |
55 |
Глава 3. За кулисами системы обработки событий.................................... |
56 |
Поток EventDispatchThread и очередь событий EventQueue................... |
56 |
Доставка событий методам processXXXEvent() ....................................... |
58 |
IV |
|
Содержание |
|
Маскирование и поглощение событий...................................................... |
62 |
|
Работа с очередью событий ...................................................................... |
67 |
|
Влияние на программы потока EventDispatchThread............................... |
68 |
|
Отзывчивость программы и SwingWorker ................................................. |
73 |
|
Почему мы так запускаем Swing-приложения.......................................... |
75 |
|
Отладка потоков в системе событий...................................................... |
78 |
|
Резюме ...................................................................................................... |
79 |
Глава 4. |
Рисование в Swing ........................................................................... |
80 |
|
Система рисования.................................................................................. |
80 |
|
Метод paint() — резюме.............................................................................. |
83 |
|
Метод repaint() — пара дополнений.......................................................... |
84 |
|
Рисование легковесных компонентов....................................................... |
84 |
|
Легковесные компоненты: резюме............................................................ |
89 |
|
Система рисования Swing ....................................................................... |
89 |
|
Кэширование............................................................................................... |
90 |
|
Разделение обязанностей.......................................................................... |
91 |
|
Метод paintComponent() ............................................................................. |
91 |
|
Метод paintBorder() ..................................................................................... |
92 |
|
Метод paintChildren()................................................................................... |
93 |
|
Общая диаграмма рисования в Swing ...................................................... |
94 |
|
Программная перерисовка в Swing........................................................... |
95 |
|
Рисование в Swing: резюме...................................................................... |
96 |
|
Рисование «готовых» компонентов........................................................... |
96 |
|
Рисование вне рамок............................................................................... |
99 |
|
RepaintManager как прикладной инструмент ......................................... |
99 |
|
Отладка графики.................................................................................... |
102 |
|
Резюме .................................................................................................... |
105 |
Глава 5. |
Внутренние винтики Swing ........................................................... |
106 |
|
Проверка корректности компонентов................................................... |
106 |
|
Метод Swing: revalidate() .......................................................................... |
108 |
|
Проверка корректности в Swing: резюме................................................ |
110 |
|
Клавиатурные сокращения..................................................................... |
111 |
|
Класс KeyStroke ........................................................................................ |
111 |
|
Карты входных событий и команд........................................................... |
112 |
|
Методы поддержки клавиатурных сокращений...................................... |
113 |
|
Система передачи фокуса ввода.......................................................... |
116 |
|
Настройка системы передачи фокуса..................................................... |
117 |
|
Расширенные возможности ..................................................................... |
120 |
|
Всплывающие подсказки и клиентские свойства................................. |
121 |
|
Резюме .................................................................................................... |
122 |
Глава 6. Контейнеры высшего уровня ........................................................ |
123 |
|
|
Корневая панель JRootPane.................................................................. |
123 |
|
Многослойная панель JLayeredPane....................................................... |
124 |
|
Панель содержимого................................................................................ |
129 |
|
Строка меню.............................................................................................. |
130 |
|
Прозрачная панель................................................................................... |
131 |
|
Корневая панель — итог .......................................................................... |
136 |
|
Расширение границ — J(X)Layer ............................................................. |
139 |
|
Окна Swing .............................................................................................. |
142 |
Окно без рамки JWindow .......................................................................... |
142 |
Содержание |
V |
Окно с рамкой JFrame .............................................................................. |
145 |
События окон............................................................................................ |
146 |
Диалоговое окно JDialog .......................................................................... |
147 |
Специальное оформление окон.............................................................. |
150 |
Прозрачность и произвольные формы ................................................... |
152 |
Кратко об апплетах — класс JApplet..................................................... |
154 |
Многооконное окружение....................................................................... |
156 |
Внутренние окна JInternalFrame .............................................................. |
159 |
Резюме .................................................................................................... |
160 |
Глава 7. Искусство расположения................................................................ |
161 |
Как работает менеджер расположения ................................................ |
162 |
Стандартные менеджеры расположения............................................. |
167 |
Полярное расположение BorderLayout ................................................... |
167 |
Последовательное расположение FlowLayout ....................................... |
169 |
Табличное расположение GridLayout ...................................................... |
171 |
Динамические вкладки и CardLayout....................................................... |
174 |
Менеджер расположения SpringLayout................................................... |
174 |
Абсолютное расположение...................................................................... |
176 |
Вложенные расположения....................................................................... |
176 |
Блочное расположение BoxLayout .......................................................... |
177 |
Расстояние между компонентами................................................... |
180 |
Проблема с распорками..................................................................... |
186 |
Выравнивание компонентов по осям............................................... |
187 |
Расположение по группам: GroupLayout ................................................. |
191 |
Гибкая сетка: GridBagLayout .................................................................... |
191 |
Быстрый язык MigLayout........................................................................ |
198 |
Общий подход......................................................................................... |
200 |
Рекомендации от Sun ............................................................................... |
202 |
Рекомендации по расположению и класс LayoutStyle ........................... |
203 |
Реализация в коде: вложенные блоки..................................................... |
204 |
Реализация: гибкая сетка......................................................................... |
211 |
Резюме .................................................................................................... |
212 |
Глава 8. Вывод вспомогательной информации....................................... |
213 |
Надписи JLabel ....................................................................................... |
213 |
Значки Icon ................................................................................................ |
216 |
Использование HTML ............................................................................... |
218 |
Надписи и события................................................................................... |
220 |
Надписи и мнемоники............................................................................... |
220 |
Всплывающие подсказки....................................................................... |
222 |
Настройка подсказок ................................................................................ |
225 |
Рамки....................................................................................................... |
227 |
Фабрика BorderFactory ............................................................................. |
231 |
Создание собственных рамок.................................................................. |
232 |
Рамки и разработка собственных компонентов ..................................... |
236 |
Резюме .................................................................................................... |
238 |
Глава 9. Элементы управления..................................................................... |
239 |
Кнопки JButton ........................................................................................ |
239 |
Внешний вид кнопок ................................................................................. |
239 |
У кнопок есть модель................................................................................ |
244 |
Обработка событий от кнопок.................................................................. |
245 |
VI |
Содержание |
Мнемоники................................................................................................. |
248 |
Интерфейс Action...................................................................................... |
251 |
Элементы управления с двумя состояниями....................................... |
253 |
Выключатели JToggleButton ..................................................................... |
253 |
Группы элементов управления ButtonGroup........................................... |
255 |
Переключатели JRadioButton................................................................... |
257 |
Флажки JCheckBox.................................................................................... |
259 |
Дополнительные значки........................................................................... |
260 |
Резюме .................................................................................................... |
261 |
Глава 10. Меню и панели инструментов...................................................... |
262 |
Меню........................................................................................................ |
262 |
Создание системы меню.......................................................................... |
263 |
Строка меню JMenuBar ............................................................................ |
266 |
Выпадающие меню JMenu и разделители JSeparator ........................... |
267 |
Клавиатурные сокращения и мнемоники................................................ |
269 |
Всплывающие меню JPopupMenu........................................................... |
273 |
Загрузка меню из файлов XML................................................................ |
275 |
Панели инструментов............................................................................. |
284 |
Простые панели инструментов................................................................ |
284 |
Комбинирование панелей инструментов................................................ |
287 |
Резюме .................................................................................................... |
291 |
Глава 11. Списки .............................................................................................. |
292 |
Обычные списки JList............................................................................. |
292 |
Модели....................................................................................................... |
295 |
Модели для больших списков.................................................................. |
300 |
Выделение................................................................................................. |
301 |
Внешний вид списка................................................................................. |
306 |
События списка......................................................................................... |
313 |
Список из флажков................................................................................... |
316 |
Списки JList в Java 7................................................................................. |
322 |
Раскрывающиеся списки JComboBox ................................................... |
322 |
Модель ComboBoxModel .......................................................................... |
324 |
Внешний вид списка................................................................................. |
330 |
Редактирование ........................................................................................ |
333 |
События раскрывающегося списка......................................................... |
337 |
Управление всплывающим меню............................................................ |
340 |
Резюме .................................................................................................... |
341 |
Глава 12. Диапазоны значений...................................................................... |
342 |
Ползунки JSlider...................................................................................... |
342 |
Модель BoundedRangeModel ................................................................... |
345 |
События ползунков................................................................................... |
347 |
Дополнительная настройка внешнего вида............................................ |
349 |
Индикаторы процесса JProgressBar ..................................................... |
352 |
Когда ничего не ясно................................................................................. |
356 |
Небольшие хитрости ................................................................................ |
358 |
Счетчики JSpinner................................................................................... |
360 |
Выбор дат.................................................................................................. |
363 |
Редактор элементов ................................................................................. |
366 |
Резюме .................................................................................................... |
371 |
Содержание |
VII |
Глава 13. Управление пространством.......................................................... |
372 |
Панель с вкладками JTabbedPane ........................................................ |
372 |
Модель выделения и обработка событий............................................... |
376 |
Дополнительные возможности компонента JTabbedPane..................... |
379 |
Размещение компонентов во вкладках................................................... |
381 |
Разделяемая панель JSplitPane ............................................................ |
384 |
Свойства разделяемой панели................................................................ |
387 |
События разделяемой панели................................................................. |
389 |
Разделяемая панель в насыщенных интерфейсах................................ |
389 |
Панель прокрутки JScrollPane ............................................................... |
390 |
Управление прокруткой............................................................................ |
393 |
Компонент JViewport................................................................................. |
397 |
Особенности реализации класса JViewport ..................................... |
400 |
Заголовки и уголки панели прокрутки JScrollPane ................................. |
400 |
Полосы прокрутки JScrollBar.................................................................... |
404 |
Резюме .................................................................................................... |
406 |
Глава 14. Стандартные диалоговые окна................................................... |
407 |
Многоликий класс JOptionPane ............................................................. |
408 |
Вывод сообщений..................................................................................... |
408 |
Ввод данных.............................................................................................. |
412 |
Получение подтверждений ...................................................................... |
416 |
Дополнительные возможности ................................................................ |
420 |
Выбор файлов в компоненте JFileChooser .......................................... |
420 |
Фильтры файлов....................................................................................... |
424 |
Внешний вид файлов ............................................................................... |
427 |
Дополнительные компоненты.................................................................. |
429 |
Выбор цвета в компоненте JColorChooser ........................................... |
433 |
Резюме .................................................................................................... |
435 |
Глава 15. Уход за деревьями......................................................................... |
436 |
Простые деревья.................................................................................... |
436 |
Модель дерева TreeModel ..................................................................... |
439 |
Узлы TreeNode........................................................................................... |
444 |
Стандартная модель DefaultTreeModel ................................................... |
445 |
Оповещение в нестандартных моделях.................................................. |
451 |
Модели деревьев — краткое резюме............................................... |
452 |
Выделение.............................................................................................. |
452 |
Внешний вид деревьев.......................................................................... |
458 |
Дерево с флажками................................................................................ |
462 |
Редактирование узлов ........................................................................... |
468 |
Создание собственного редактора.......................................................... |
472 |
Дополнительные события деревьев..................................................... |
476 |
Резюме .................................................................................................... |
478 |
Глава 16. Текстовые компоненты................................................................. |
479 |
Каталог текстовых компонентов............................................................ |
480 |
Текстовые поля......................................................................................... |
480 |
Многострочное поле JTextArea ................................................................ |
483 |
Редактор JEditorPane................................................................................ |
487 |
Редактирование по максимуму — компонент JTextPane....................... |
491 |
Форматированный вывод — компонент JFormattedTextField ................ |
495 |
Модель документа Document ................................................................ |
500 |
VIII |
Содержание |
Текстовое поле с автоматическим заполнением.................................... |
502 |
Отмена и повтор операций ...................................................................... |
507 |
Управление курсором — интерфейс Caret........................................... |
510 |
Дополнительное выделение текста...................................................... |
513 |
Резюме .................................................................................................... |
515 |
Глава 17. Таблицы........................................................................................... |
516 |
Простые таблицы ................................................................................... |
516 |
Простая настройка внешнего вида....................................................... |
520 |
Модели таблицы JTable.......................................................................... |
522 |
Модель данных TableModel ...................................................................... |
523 |
Модель таблицы для работы с базами данных...................................... |
531 |
Модель столбцов таблицы....................................................................... |
537 |
Модели выделения................................................................................... |
544 |
Сортировка и фильтрация........................................................................ |
548 |
Внешний вид ячеек таблицы................................................................. |
554 |
Редактирование ячеек таблицы............................................................ |
560 |
Редактор дат.............................................................................................. |
562 |
Заголовок таблицы JTableHeader.......................................................... |
566 |
Резюме .................................................................................................... |
569 |
Глава 18. Круговорот данных........................................................................ |
570 |
Обмен данными...................................................................................... |
570 |
Буфер обмена Clipboard........................................................................... |
570 |
Типы данных для обмена......................................................................... |
571 |
Адаптация данных.................................................................................... |
574 |
Буфер обмена и стандартные компоненты Swing.................................. |
578 |
Операции перетаскивания....................................................................... |
578 |
TransferHandler и буфер обмена.............................................................. |
585 |
Отмена и повтор операций.................................................................... |
587 |
Резюме .................................................................................................... |
591 |
Введение
Java, «чистокровный» объектно-ориентированный язык с прекрасным набором библиотек, изначально переносимый между различными платформами и практически не зависящий от конкретного производителя, быстро завоевал сердца разработчиков и признание крупнейших производителей программного обеспечения. Это скорее не язык, а платформа. Со времени первого издания книги платформа Java стала еще более популярна и является, пожалуй, самым распространенным решением при создании различных сложных приложений. Она охватывает практически все области, в которых применяется программирование: платформа J2ME (Java 2 Micro Edition) предназначена для создания приложений для мобильных устройств с ограниченными ресурсами, платформа J2EE (Java 2 Enterprise Edition) позволяет создавать распределенные системы самого высокого качества и любого уровня сложности, а также пользовательские интерфейсы Web, но ядром Java можно без сомнения назвать платформу J2SE (Java 2 Standard Edition) — именно с нее все начиналось, и эта часть Java по-прежнему является центральной. С помощью J2SE вы сможете создавать приложения для самых разнообразных нужд пользователей, это могут быть текстовые редакторы, электронные таблицы, клиенты для распределенных систем, созданных по технологии J2EE, апплеты, работающие в браузере как части HTML-страниц, удобные интерфейсы к базам данных JDBC и т. д.
Важнейшую часть любой программы составляет ее пользовательский интерфейс. На самом деле пользователя мало интересуют сложные алгоритмы обработки данных и удачные находки, реализованные внутри программы, также мало его занимают и технологии, примененные для создания самого приложения и его пользовательского интерфейса. Пользователь видит только то, что видит, и именно этот факт следует учитывать при решении всех задач по проектированию и созданию пользовательского интерфейса. Интерфейс должен быть максимально быстрым и максимально удобным для пользователя, который должен также получать и эстетическое удовольствие от работы с вашей программой.
Сегодня особенно популярны пользовательские интерфейсы HTML в сети Web, которые с появлением динамического обновления данных с помощью AJAX во многом вытесняют стандартные приложения операционных систем. Написание таких интерфейсов бывает трудоемким и требует взаимодействия распределенных сетевых систем, в то время как стандартные интерфейсы операционных систем зачастую помогают быстрее создать полнофункциональное приложение, особенно если вам помогает библиотека высокого качества и вам необходим полный доступ к ресурсам системы.
В этой книге мы увидим, на что способны современные версии Java при создании пользовательского интерфейса приложений. В вашем распоряжении окажутся и мельчайшие детали внешнего вида программ, и средства обработки данных, которые должен будет отображать компонент. Java располагает множеством компонентов, способных удовлетворить самый взыскательный вкус и вывести на экран самые замысловатые данные. И как бы сложно ни было то, что вы намереваетесь создать, изучение и освоение инструментов, которые окажутся у вас в руках, не потребует титанических усилий. Поняв основные принципы работы компонентов и разобрав несколько простых примеров, вы осознаете, что получили не обычный набор библиотек для создания пользовательского интерфейса, а настоящую палитру художника, которая позволит нарисовать великолепную картину всего парой несложных мазков.
X |
Введение |
Java Foundation Classes
Одной из самых больших и самых важных частей платформы J2SE является набор библиотек под общим названием Java Foundation Classes (JFC). Именно эти библиотеки предназначены для создания эффектных и отточенных пользовательских интерфейсов. Ниже перечислены библиотеки, входящие в набор Java Foundation Classes:
Swing. Важнейшая часть JFC; содержит компоненты для создания пользовательского интерфейса, такие как таблицы и текстовые поля, а также инструменты для работы с этими компонентами. Библиотека Swing, как мы вскоре увидим, великолепно спланирована и реализована, она способна дать все, что может пожелать разработчик пользовательского интерфейса. Если вы создаете лаконичный «деловой» интерфейс, вам понадобится всего пара строк кода. Если же вы «раскрашиваете» ваше приложение всеми красками радуги и создаете для него сложный нестандартный интерфейс, вам понадобится немного больше усилий. Но ничего невозможного для Swing нет.
Java2D. Вторая по важности в JFC библиотека, позволяющая применять в своем приложении современную двухмерную графику, в том числе аффинные преобразования, дробные координаты, сглаживание, расширенные операции с растрами и многое другое. Библиотека Java2D встроена в Swing — все компоненты последней используют ее для вывода своих данных на экран, хотя и неявно.
Accessibility. Набор классов и интерфейсов, следующих промышленному стандарту и наделяющих приложения средствами поддержки пользователей с ограниченными возможностями. С помощью Accessibility вы сможете, например, передать текстовое описание интерфейса системе синтеза речи, что позволит работать с вашей программой пользователям с нарушениями зрения. Замечательно то, что во всех компонентах Swing интерфейсы Accessibility уже реализованы и после небольшой настройки самый обычный интерфейс моментально превращается в специализированный, ориентированный на пользователей с ограниченными возможностями. Для приложений высшего уровня качества это свойство Swing просто незаменимо.
Drag’n’Drop. Дополнение, позволяющее вашему приложению взаимодействовать с приложениями операционной системы пользователя или другими Java-приложениями с помощью технологии перетаскивания (drag and drop). Подобная возможность очень удобна для пользователя и позволяет ему сразу же забыть о том, что приложение написано на Java и не имеет практически никаких связей с его операционной системой. Напрямую с этим дополнением работать, как правило, не приходится, так как Swing берет многие детали процесса на себя.
Ядром Java Foundation Classes без всяких сомнений является библиотека Swing, остальные части набора классов так или иначе встроены в нее или предоставляют для компонентов этой библиотеки дополнительные возможности. Создавать пользовательский интерфейс своих приложений вы будете именно с помощью Swing, и именно эту библиотеку мы будем изучать. Для начала мы познакомимся с основными свойствами Swing, ее общей структурой, а затем перейдем к компонентам библиотеки. Они позволят создавать фантастические пользовательские интерфейсы всего одним мановением руки.
Структура книги
Большая часть книги посвящена описанию компонентов Swing и примерам их использования. Ну а начнем мы с исследования основных механизмов библиотеки, тех