МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра САП
Використання системи Swing в Java
Методичні матеріали
до лабораторної роботи №6 з курсу:
“Об’єктно-орієнтоване програмування”
для студентів базового напрямку
6.0804 “Комп’ютерні науки”
Затверджено
на засіданні кафедри
“Системи автоматизованого проектування”
Протокол №
від
Львів 2007
Використання системи Swing в Java. Методичні матеріали до лабораторної роботи № 6 з курсу: “Об’єктно-орієнтоване програмування” для студентів базового напрямку 6.0804 “Комп’ютерні науки”.
Укладачі:
Макар В.М., доцент, к.т.н.
Загарюк Р.В., асистент.
Відповідальний за випуск:
Рецензенти:
1. Мета роботи
Метою роботи є придбання навиків програмування графічних додатків Java з використанням системи Swing.
2. Короткі теоретичні відомості
2.1. Основні компоненти Swing
Компоненти Swing можна розділити на наступні типи:
контейнери верхнього рівня (класи JWindow, JFrame, JDialog і JApplet);
спеціалізовані контейнери (класи JInternalFrame, JLayeredPane, JRootPane і JOptionPane);
спільноцільові контейнери (класи JPanel, JScrollPane, JSplitPane, JTabbedPane і JToolBar);
компоненти управління (класи JButton, JCheckBox, JRadioButton, JToggleButton, JComboBox, JList, JMenuBar, JMenu, JMenuItem, JCheckboxMenuItem, JRadioButtonMenuItem, JSeparator і JSlider);
нередаговані інформаційні компоненти (класи JLabel, JProgressBar і JToolTip);
редаговані інформаційні компоненти (класи JColorChooser, JFileChooser, JTable, JTree, JTextField, JPasswordField, JTextArea, JEditorPane і JTextPane).
На відміну від компонентів AWT, компоненти системи Swing здатні працювати тільки по моделі делегування подій.
2.2. Контейнери верхнього рівня і спеціалізовані контейнери
Так само, як і для AWT, для створення вікон графічних додатків використовується не клас JWindow, а клас JFrame (вікна, що створюються класом JWindow не містять найменування вікна і кнопок управління вікном). Додатки з графічним інтерфейсом використовує, принаймні, один фрейм. Аплети також можуть використовувати фрейми. Для створення вікон, які залежать від іншого вікна (наприклад, зникають, коли згортається вікно, в якому вони використовуються) застосовуються діалогові вікна класу JDialog. Аплети, що використовують компоненти Swing, повинні бути підкласами класу JApplet. Будь-яка програма, яка використовує компоненти Swing, містить, принаймні, один контейнер верхнього рівня. Цей контейнер є коренем ієрархії контейнерів, що містять всі компоненти Swing. Як правило, окремий графічний додаток має, принаймні, одну ієрархію контейнерів, в якій коренем є JFrame. Діалогове вікно або аплет також утворюють ієрархію контейнерів, коренем якої є JDialog або JApplet. Наприклад, якщо додаток містить одне головне вікно і два діалогові вікна, то вона містить три ієрархії контейнерів.
2.2.1. Коренева панель
Кожен контейнер верхнього рівня базується на проміжному, прихованому, контейнері, званому кореневою панеллю (root pane). Коренева панель визначена в класі JRootPane. Сама коренева панель звичайно не використовується, а використовуються її компоненти, які коренева панель (клас) надає фрейму (або іншому контейнеру верхнього рівня). Коренева панель містить наступні компоненти:
шарувата панель (layered pane);
панель вмісту (content pane);
рядок меню (menu bar) - необов'язковий компонент;
скляна панель (glass bar).
Єдиним обов'язковим контейнером верхнього рівня є панель вмісту.
2.2.2. Панель вмісту
Панель вмісту містить всі компоненти Swing (кнопки, написи, текстові поля і т.д.). Оскільки для контейнерів верхнього рівня вміст вікна визначається за допомогою JRootPanel і повинно, на відміну від вікон AWT, визначатися уручну, для додавання компонент або установки менеджера компоновки використовуються не методи add() і setLayout(), а методи отримання і установки панелі вмісту:
public Container getContentPane()
і
public void setContentPane(Container contentPane)
які визначені в класах JFrame, JDialog, JApplet і JInternalFrame.
Так, додавання текстового поля у фрейм, діалогове вікно, аплет або внутрішній фрейм з установкою менеджера компоновки FlowLayout виглядає таким чином:
Container contentPane = getContentPane();
JTextField inputField = new JTextField(15);
contentPane.setLayout(new FlowLayout());
contentPane.add(inputField);
Слід зазначити, що для всіх контейнерів верхнього рівня (включаючи JApplet) менеджером компоновки за умовчанням є BorderLayout. До контейнера верхнього рівня може бути додана рядок меню (menu bar). Рядок меню також розташовується усередині головного контейнера, але за межами панелі вмісту.
2.2.3.Клас JFrame
Фрейм в Swing створюється за допомогою конструкторів JFrame() або JFrame (String name) де name - ім'я фрейма.
Для фрейма можна використовувати приведені вище методи отримання і установки кореневої панелі, шаруватої панелі, панелі вмісту, рядка меню і скляної панелі, причому повинно бути одержано, принаймні, значення панелі вмісту.
Іншою відмінністю JFrame від Frame є наявність у JFrame властивості, що визначає операцію закриття вікна за умовчанням. Для Frame за умовчанням нічого не відбувається, якщо робиться спроба закрити вікно, а JFrame ховається. Метод public void setDefaultCloseOperation(int operation) класу JFrame дозволяє визначити три операції, які можуть виконуватися при закритті вікна JFrame:
DO_NOTHING_ON_CLOSE - поводиться так само, як AWT Frame;
HIDE_ON_CLOSE - поведінка за умовчанням (для того, щоб вікно знову з'явилося на екрані, необхідно використовувати метод setVisible(true);
DISPOSE_ON_CLOSE - вікно закривається.
2.2.4. Діалогові вікна
Діалогові вікна можна створювати або за допомогою класу JDialog, або використовуючи клас JOptionPane. Основними конструкторами класу JDialog є:
JDialog();
JDialog(Dialog owner)
JDialog(Dialog owner, boolean modal)
JDialog(Dialog owner, String title)
JDialog(Dialog owner, String title, boolean modal)
JDialog(Frame owner)
JDialog(Frame owner, boolean modal)
JDialog(Frame owner, String title)
JDialog(Frame owner, String title, boolean modal)
Перший конструктор створює немодальне діалогове вікно без імені. Параметри owner, title і modal в решті конструкторів задають відповідно батька даного діалогового вікна, ім'я вікна і вікна (true - модальне вікно або false - немодальне вікно). Вікно класу JDialog має ті ж риси, що JFrame і пряме використання об'єктів класу JDialog аналогічно прямому використанню об'єкту JFrame. Клас JOptionPane полегшує виведення стандартних діалогових або інформаційних вікон. Для класу JOptionPane визначені наступні основні конструктори:
JOptionPane();
JOptionPane(Object message, int messageType int optionType, Icon icon Object[] options Object initialValue);
Окрім цього визначені конструктори, що містять відповідно тільки перший параметр, тільки перші два параметри, тільки перші три параметри, тільки перші чотири параметри, тільки перші п'ять параметрів другого конструктора.
Всі використання цього класу звичайно зводяться до виклику одного з його методів:
static int showConfirmDialog(Component parentComponent, Object message, String title, int optionType, int messageType, Icon icon) - ставить питання на який потрібна відповідь типу Yes, No або Cancel. Існують також наступні три методи showConfirmDialog(): метод, що містить перші два параметри, метод, що містить перші чотири параметри і метод, що містить перші п'ять параметрів, приведені вище методи;
static Object showInputDialog(Component parentComponent, Object message, String title, int messageType, Icon icon Object[] selectionValues, Object initialValue) - дозволяє ввести деякий текст. Існують також наступні п'ять методів showInputDialog(): метод, що містить другий параметр, метод, що містить другий і сьомий параметри, метод, що містить перші два параметри, метод, що містить перший, другий і сьомий параметри, і метод, що містить перші три параметри і сьомий параметр;
static void showMessageDialog(Component parentComponent, Object message, String title, int messageType, Icon icon) - дозволяє вивести деяке повідомлення. Існують також наступні два методи showMessageDialog: метод, що містить перші два параметри і метод, що містить перші чотири параметри;
static int showOptionDialog(Component parentComponent, Object message, String title, int optionType, int messageType, Icon icon Object[] options, Object initialValue) - об'єднує функції перерахованих вище діалогових вікон.
Параметри в приведених конструкторах і методах мають наступний сенс:
parentComponent - визначає компонент, що є батьком даного діалогового вікна (якщо цей параметр рівний null, як батько передбачається фрейм за умовчанням);
message - описове повідомлення, що поміщається в діалогове вікно (слід мати на увазі, що це об'єкт класу Object);
selectionValues - масив об'єктів, що розглядається як набір повідомлень;
icon - зображення, що виводиться в діалозі (значення за умовчанням визначається значенням параметра messageType);
messageType - визначає тип повідомлення. Допустимі наступні значення: ERROR_MESSAGE, INFORMATION_MESSAGE, WARNING_MESSAGE, QUESTION_MESSAGE і PLAIN_MESSAGE;
optionType - визначає набір кнопок, які будуть виведені в нижній частині діалогового вікна: DEFAULT_OPTION, YES_NO_OPTION, YES_NO_CANCEL_OPTION і OK_CANCEL_OPTION
options - детальніший опис набору кнопок, які будуть виведені в нижній частині діалогового вікна (якщо заданий об'єкт класу Component, він прямо додається в нижню частину діалогового вікна, якщо об'єкт типу Icon, створюється кнопка класу JButton, для об'єктів інших класів проводиться перетворення об'єкту в рядок, який виводиться на кнопці класу JButton);
title - ім'я діалогового вікна;
initialValue - значення, що вводиться, за умовчанням.
Для методів і допустимі наступні можливі значення значення, що повертається: YES_OPTION, NO_OPTION, CANCEL_OPTION, OK_OPTION і CLOSED_OPTION.
2.3. Спільноцільові контейнери
2.3.1. Клас JPanel
Клас JPanel є варіантом класу Panel в AWT. Чотири конструктори класу:
public JPanel()
public JPanel(LayoutManager layout)
public JPanel(boolean isDoubleBuffered)
public JPanel(LayoutManager layout boolean isDoubleBuffered)
забезпечують створення об'єкту JPanel відповідно під управлінням менеджера компоновки FlowLayout, під управлінням заданого менеджера компоновки, з вбудованою підтримкою подвійної буферизації і, нарешті, під управлінням заданого менеджера компоновки і з вбудованою підтримкою подвійної буферизації.
Робота з об'єктами класу JPanel не відрізняється від роботи з об'єктами класу Panel. за винятком того, що панель додаються не у фрейм, а в панель вмісту фрейма.
2.3.2. Клас JTabbedPane
Панель з вкладками (tabbed pane) введена в Swing замість того, що використалося в AWT менеджера CardLayout, тобто менеджер компоновки CardLayout в Swing не реалізований. Кожна вкладка має заголовок. Коли користувач вибирає вкладку, її вміст стає видимим. Тільки одна з вкладок може бути вибрана одночасно. Панель з вкладками звичайно використовується для установки параметрів конфігурації.
Панель з вкладками реалізована класом JTabbedPane, який має наступні конструктори
JTabbedPane()
JTabbedPane(int tabPlacement)
JTabbedPane(int tabPlacement, int tabLayoutPolicy)
Перший конструктор створює нову панель з вкладками, в якій заголовки вкладок розташовані зверху, а другий дозволяє визначити розташування заголовків вкладок (JTabbedPane.TOP - зверху, JTabbedPane.BOTTOM - знизу, JTabbedPane.RIGHT - управо або JTabbedPane.LEFT - вліво). Третій конструктор додатково задає правило розташування вкладок (JTabbedPane.WRAP_TAB_LAYOUT - вкладки розташовуються в декілька рядів, якщо вони не поміщаються в одному ряду - значення за умовчанням і JTabbedPane.SCROLL_TAB_LAYOUT - вкладки прокручуються, якщо вони не поміщаються в одному ряду).
Формування в програмі панелі з вкладками виконується за допомогою наступної процедури:
1. Створити об'єкт JTabbedPane.
2. Для додавання кожної вкладки в панель викликати один з методів addTab():
public void addTab(String title, Icon icon Component component, String tip)
public void addTab(String title, Icon icon Component component)
public void addTab(String title, Component component)
Аргументи цих методів визначають заголовок вкладки title, компоненту component, який вона містить, зображення icon і спливаючу підказку tip.
3. Додати панель з вкладками в панель змісту вікна.
Для відстежування вибору тієї або іншої вкладки використовується блок прослуховування ChangeListener, який додається або віддаляється за допомогою методів public void addChangeListener(ChangeListener l) і public void removeChangeListener(ChangeListener l) класу JTabbedPane. У інтерфейсі ChangeListener визначений єдиний метод public void stateChanged(ChangeEvent e) у якому за допомогою методів public Component getSelectedComponent() або public int getSelectedIndex() класу JTabbedPane можна одержати вибраний компонент або індекс вибраного компоненту.
2.3.3. Клас JSplitPane
Розщеплені панелі (клас JSplitPane) використовуються для розділення панелі, що виводиться, на дві компоненти. Конструктори класу
public JSplitPane()
public JSplitPane(int newOrientation)
public JSplitPane(int newOrientation boolean newContinuousLayout)
public JSplitPane(int newOrientation Component newLeftComponent, Component newRightComponent)
public JSplitPane(int newOrientation boolean newContinuousLayout, Component newLeftComponent
Component newRightComponent)
задають в параметрі newOrientation вирівнювання зліва направо з використанням константи JSplitPane.HORIZONTAL_SPLIT або зверху вниз з використанням константи JSplitPane.VERTICAL_SPLIT, у параметрі newContinuousLayout безперервне перемальовування компонент при переміщенні роздільника (значення true) або перемальовування компонент після закінчення переміщення роздільника (значення false), а в параметрах newLeftComponent і newRightComponent - компоненти розщепленої панелі.
Положення роздільника в панелі задається за допомогою методу public void setDividerLocation(int location) який задає в пікселях позицію x або у роздільника (залежно від вертикальної або горизонтальної орієнтації панелей). Метод public void setOneTouchExpandable(boolean newValue) дозволяє задати на розділовій смузі кнопки (із стрілками) для швидкого згортання і розгортання однієї з панелей розщепленої панелі.
2.4. Значки, написи і кнопки
2.4.1. Інтерфейс Icon і клас ImageIcon
Значки (icons) реалізуються в Swing за допомогою інтерфейсу Icon (насправді вони не є компонентами і їх можна використовувати практично зі всіма компонентами Swing). Реалізацією інтерфейсу Icon, що створює значок із зображення, є клас ImageIcon. Двома основними конструкторами цього класу є:
ImageIcon(String filename)
ImageIcon(URL url)
Перша форма використовує зображення у файлі з ім'ям filename (використовується в графічних додатках) а друга форма - в ресурсі, розташованому по URL-адресі url (використовується в аплетах Swing). На відміну від класу Image, в класі ImageIcon зображення завантажується заздалегідь з використанням методів класу MediaTracker. Для створення власних зображень можна безпосередньо реалізовувати інтерфейс Icon.
2.4.2. Клас JLabel
Написи Swing є об'єктами класу JLabel. Цей об'єкт може відображати тексти і/або значки.
Основними його конструкторами є:
JLabel(Icon image)
JLabel(String text)
JLabel (String text, Icon image, int horizontalAlignment)
У цих конструкторах text і image - текст і значок, використовуваний в написі. Параметр horizontalAlignment визначає вирівнювання і має значення LEFT, RIGHT або CENTER. Ці константи визначені в інтерфейсі SwingConstants, разом з декількома іншими, використовуваними класами системи Swing. Значок і текст, пов'язаний з написом, можна прочитувати і записувати наступними методами:
public Icon getIcon();
public String getText();
public void setIcon(Icon image);
public void setText(String text);
2.4.3. Клас AbstractButton
Кнопки Swing є підкласами класу AbstractButton. Цей клас містить багато методів, які дозволяють управляти поведінкою кнопок, прапорців і перемикачів. Наприклад, можна визначати різні значки для відображення компоненту, коли він віджатий (disabled), натиснутий (pressed), або вибраний (selected). Деякий значок можна використовувати як значок "наїзду" (rollover), який відображається, коли курсор миші встановлений поверх цього компоненту ("наїхав" на нього). Нижче приведені описи методів, які управляють цією поведінкою:
public void setDisabledIcon(Icon image)
public void setPressedIcon (Icon image)
public void setSelectedIcon(Icon image)
public void setRolloverIcon(Icon image)
Текст, пов'язаний з кнопкою, можна читати і записувати за допомогою наступних методів:
public String getText()
public void setText(String text)
У класі AbstractButton визначені також методи public int getMnemonic() і public void setMnemonic(int mnemonic) відповідно для отримання і установки ЀгарячихЀ клавіш. Як параметр при установці ЀгарячоїЀ клавіші задається воно із статичних властивостей класу KeyEvent. Ці властивості мають загальне ім'я VK_XXX, де XXX - ім'я однієї з клавіш, наприклад VK_D. При натисненні кнопки конкретні підкласи AbstractButton генерують події Action. Блоки прослуховування реєструють і відміняють реєстрацію для цих подій за допомогою наступних методів:
void addActionListener(ActionListener l)
void removeActionListener(ActionListener l)
2.4.4. Клас Jbutton
Клас JButton є підкласом класу AbstractButton і забезпечує функціональні можливості кнопки. Цей клас дозволяє пов'язати з кнопкою зображення, текст або і те і інше.
Деякі з його конструкторів:
JButton(Icon image)
JButton(String text)
JButton(String text, Icon image)
Тут text і image - напис і зображення, використовувані для кнопки. Клас JButton успадковує властивості інтерфейсу SwingConstants, а також властивості і методи класу AbstractButton.
2.5. Прапорці і перемикачі
Клас JCheckBox, який забезпечує функціональні можливості прапорця, є конкретною реалізацією класу AbstractButton.
Деякі з його конструкторів:
JCheckBox(Icon image)
JCheckBox(Icon image, boolean state)
JCheckBox(String text)
JCheckBox(String text, boolean state)
JCheckBox (String text, Icon image)
JCheckBox(String text, Icon image, boolean state)
У цих конструкторах використовуються наступні параметри: image - зображення для прапорця, text - напис. Якщо state має значення true, то прапорець спочатку вибраний. Стан прапорця може бути змінений за допомогою методу void public void setSelected(boolean b) а отримати багатство прапорця можна за допомогою методу public boolean isSelected().
Перемикачі підтримуються класом JRadioButton, який також є конкретною реалізацією класу AbstractButton.
Нижче приведені деякі з його конструкторів:
JRadioButton(Icon image)
JRadioButton(Icon image, boolean state)
JRadioButton(String text)
JRadioButton(String text, boolean state)
JRadioButton(String text, Icon image)
JRadioButton(String text, Icon image, boolean state)
де параметри мають той же сенс, що і для класу JCheckBox.
Перемикачі повинні бути об'єднані в групу, де в кожен момент може бути вибраний тільки один елемент. Наприклад, якщо користувач клацає по перемикачу, який знаходиться в групі, будь-який заздалегідь натиснутий перемикач в цій групі автоматично скидається. Щоб створити групу кнопок, створюється об'єкт класу ButtonGroup. Для цієї мети використовується єдиний конструктор класу public ButtonGroup(). Елементи до групи перемикачів додаються за допомогою методу public void add(AbstractButton а) а кількість перемикачів в групі можна одержати за допомогою методу public int getButtonCount().
Батьківським класом і для JCheckBox і для JRadioButton є клас JToggleButton, який не має еквівалента в AWT. Він поводиться як об'єкт класу Button, який після натиснення на нього залишається в натиснутому стані.
2.6. Списки
2.6.1. Клас JComboBox
Замість класу Choice в AWT, в системі Swing забезпечує комбіноване поле (combo box) - комбінація текстового поля і списку, що розкривається (клас JComboBox). Комбіноване поле звичайно відображає один вхід (елемент) списку. Проте воно може також відображати і список, що розкривається, який дає можливість користувачу вибирати різні елементи. Ви також можете ввести з клавіатури своє значення елементу списку в текстове поле. Два найпоширеніші конструктори:
JComboBox()
JComboBox(Object [] items)
дозволяють створити порожній список з вибором або задати масив об'єктів даного списку.
Елементи додаються до списку вибору за допомогою методу void addItem(Object obj) де obj - об'єкт, який буде доданий до комбінованого поля. Решта методів клас аналогічна відповідним методам класу Choice, проте додані методи public void setEditable(boolean aFlag) і public boolean isEditable(), що дозволяють встановити можливість введення значення в список і перевірити прапорець можливості введення свого значення в список.
Для обробки подій, пов'язаних з комбінованим списком, можна використовувати або блоки прослуховування ItemListener, або блоки прослуховування ActionListener, описані раніше для компонент AWT.
2.6.2. Клас JList
Аналогом класу List в Swing є клас JList. Два найпоширеніші конструктори цього класу
JList()
JList(Object [] items)
дозволяють задати або порожній список, або список, що містить задані об'єкти (оберніть уваги, що елементами списків в Swing можуть бути не тільки рядки, але довільні об'єкти). не виконується в JList автоматично, а виконується за допомогою приміщення списку в об'єкт класу JScrollPane.
Набір методів в класі JList істотно розширений в порівнянні з класом List (так, наприклад, є можливість задавати колір тексту і фону для виділених елементів) і, крім того, замість інтерфейсу ItemListener для списків JList використовується інтерфейс ListSelectionListener, блок прослуховування якого додається і віддаляється за допомогою методів public void addListSelectionListener(ListSelectionListener listener) і public void removeListSelectionListener( ListSelectionListener listener) класу JList.
Метод public void valueChanged(ListSelectionEvent e) інтерфейсу обробляє події, пов'язані з вибором елементів списку, а метод public Object[] getSelectedValues() класу JList дозволяє одержати список вибраних об'єктів.
2.7. Текстові компоненти
2.7.1. Клас JTextComponent
Батьківським класом текстових компонент в Swing є клас JTextComponent. Він забезпечує функціональні можливості, які є загальними для всіх текстових компонент.
Можливості компоненту JTextComponent бібліотеки Swing набагато перевершують вимоги, що пред'являються до звичайного текстового поля або напису. Даний компонент надає розробникам великий набір методів роботи з текстом, наприклад:
public void сміттю() - копіювати в буфер обміну;
public void cut() - вирізувати в буфер обміну;
public void paste() - вставити з буфера обміну;
public String getSelectedText() - одержати виділений текст;
public int getSelectionStart() - визначити крапку почала виділеного тексту;
public int getSelectionEnd() - визначити точку кінця виділеного тексту;
public String getText() - ввести текст з поля;
public void setText(String text) - помістити текст в полі;
public void setEditable(boolean b) - вирішити редагування;
public void setCaretPosition(int position) - помістити курсор у вказану позицію.
2.7.2. Класи JTextField, JPasswordField і JTextArea
Підкласи класу JTextComponent - JTextField і JTextArea практично аналогічні класам TextField і TextArea пакету AWT. Між ними існують лише наступні відмінності:
рядки введення паролів задаються в Swing за допомогою окремого класу JPasswordField (конструктори цього класу аналогічні конструкторам класу JTextField, метод public char[] getPassword() дозволяє набути значення введеного пароля, а методи public void setEchoChar(char з) і public char getEchoChar() - встановити і набути значення символу луни);
прокрутка об'єкту класу JTextArea (так само, як і об'єкту класу JList) виконується за допомогою приміщення списку в об'єкт класу JScrollPane.
2.8. Меню
Компоненти JMenuBar, JMenu, JMenuItem і JCheckBoxMenuItem в Swing по своїх функціональних можливостях і використанні аналогічні компонентам MenuBar, Menu, MenuItem і CheckboxMenuItem, використовуваним в AWT.
Новий компонент JRadioButtonMenuItem дозволяє організувати в меню перемикачі. Група альтернативних перемикачів формується таким чином: спочатку створюється об'єкт класу ButtonGroup, а потім в цей об'єкт за допомогою методу add() додаються об'єкти класу JRadioButtonMenuItem.
Класи, що реалізовують меню в Swing, відрізняються від відповідних класів AWT наступними основними особливостями: оскільки всі класи, окрім JMenuBar, є підкласами класу JAbsractButton, для меню і пунктів меню можна задавати не тільки текст, але і зображення (для цього в конструктори цих класів введений параметр Icon image і додані методи, пов'язані із зображеннями); рядок меню встановлюється за допомогою методу public void setJMenuBar(JMenuBar menubar) класу JFrame; доданий інтерфейс MenuListener для обробки подій пов'язаних з меню (об'єктами класу JMenu). Методи цього інтерфейсу
public void menuSelected(MenuEvent e)
public void menuDeselected(MenuEvent e)
public void menuCanceled(MenuEvent e)
дозволяють обробляти події, пов'язані з вибором меню, відміною вибору меню і відміною меню. Блоки прослуховування для меню додаються і віддаляються за допомогою методів
public void addMenuListener(MenuListener l) і
public void removeMenuListener(MenuListener l);
мнемонічні клавіші (гарячі клавіші) для меню і пунктів меню на відміну від AWT діють тільки тоді, коли відповідні меню або пункти меню виведені на екрані. Для того, щоб клавіші діяли незалежно від того, чи видно відповідний елемент меню на екрані, необхідно задати такі клавіші за допомогою методу public void setAccelerator(KeyStroke keyStroke); для пунктів меню введений інтерфейс MenuDragMouseListener, методи якого
public void menuDragMouseEntered(MenuDragMouseEvent e)
public void menuDragMouseExited(MenuDragMouseEvent e)
public void menuDragMouseDragged(MenuDragMouseEvent e)
public void menuDragMouseReleased(MenuDragMouseEvent e)
дозволяють організувати обробку подій, пов'язаних з переміщенням курсора миші над пунктами меню (наприклад, зміни виду пункту меню при наведенні на нього курсора миші). Блоки прослуховування для меню додаються і віддаляються за допомогою методів
public void addMenuDragMouseListener(
MenuDragMouseListener l) і
public void removeMenuDragMouseListener(
MenuDragMouseListener l);
окрім цього, для пунктів меню введений інтерфейс MenuKeyListener, методи якого
public void menuKeyTyped(MenuKeyEvent e)
public void menuKeyPressed(MenuKeyEvent e)
public void menuKeyReleased(MenuKeyEvent e)
дозволяє організувати обробку подій, пов'язаних з натисненням і відпуском, а також окремо з натисненням і окремо з відпуском клавіш, пов'язаних з пунктами меню.
2.9. Бігунки і підказки
2.9.1. Класи JScrollBar і JSlider
Смуга прокрутки (клас JScrollBar) в Swing практично не відрізняється від смуги прокрутки (клас Scrollbar) в AWT. Бігунки реалізуються в Swing за допомогою класу JSlider. Цей компонент, як і JScrollBar, дозволяє вибрати значення за допомогою переміщення бігунка. Основними конструкторами класу JSlider є
JSlider()
JSlider(int orientation)
JSlider(int min, int max)
JSlider(int min, int max, int value)
JSlider(int orientation, int min, int max, int value)
де параметр orientation задає орієнтацію, а параметри min, max і value відповідно мінімальне, максимальне і поточне значення бігунка. Для бігунків можна задати лінійки з ризиками великої або маленької висоти з використанням методів public void setMajorTickSpacing(int n) і public void setMinorTickSpacing(int n) де параметр n задає відстань між ризиками в пікселях. Для відстежування подій бігунка використовується інтерфейс ChangeListener, описаний вище для індикатора.
2.9.2. Клас JToolTip
Спливаючі підказки (текст, що з'являється, якщо навести на деякий час покажчик миші на який-небудь об'єкт) реалізуються в Swing за допомогою класу JToolTip. Об'єкт цього класу створюється за допомогою конструктора JToolTip(). Прикріпити підказки до компоненту і одержати компонент, до якого прикріплена дана підказка, можна за допомогою методів void setComponent(JComponent comp) і JComponent getComponent(), а установка і отримання тексту підказки виконується за допомогою методів void setTipText(String tipText) і String getTipText().
Методи класу JComponent public void setToolTipText(String text) і public String getToolTipText() дозволяють встановити і одержати підказку безпосередньо для будь-якого графічного компоненту.
2.10. Оформлення рамок
Кожен стандартний графічний компонент в Java міститься в прямокутній області на екрані із сторонами, паралельними сторонам екрану. Для деяких графічних компонент сторони цього прямокутника виділяються якимсь чином. Так, наприклад, сторони кнопки класу JButton намальовані так, що створюють враження її опуклості. При натисненні кнопки миші на ній графічне оформлення сторін кнопки JButton міняється, створюючи враження її вдавленності.
Бібліотека Swing дозволяє змінити оформлення меж будь-якого компоненту, у тому числі і контейнера за допомогою рамок різного вигляду. Найзагальніші характеристики всіх рамок описані інтерфейсом Border з пакету javax.swing.border. Викреслювання рамки виконується методом public void paintBorder(Component з, Graphics g int x, int у, int width, int height);
Тут задається компонент з, який обводиться рамкою, екземпляр g класу Graphics, володіючого методами малювання, і розміри рамки, які звичайно співпадають з розмірами компоненту, або трохи більше або трохи менше за них.
Рамка може бути прозорою або непрозорою. Це наголошується логічним методом public boolean isBorderOpaque().
Третій і останній метод інтерфейсу public Insets getBorderInsets(Component з) повертає простір, зайнятий рамкою даного компоненту з, у вигляді екземпляра класу Insets. У класі Insets цей простір визначається завтовшки рамки зверху top, зліва left, справа right і знизу bottom. Всі чотири поля класу Insets є цілочисельними змінними. який можна використовувати для визначення розмірів самого компоненту без рамки.
Клас AbstractBorder розширюють близько двадцяти класів, що викреслюють найрізноманітніші рамки. Для зручності роботи з ними в пакеті javax.swing є клас BorderFactory, в якому зібрані статичні методи виду createXxxBorder() для різних типів рамок з різними параметрами. Найчастіше для створення рамки досить скористатися одним з цих методів, а потім встановити одержану рамку в компонент методом public void setBorder(Border border) класу JComponent, наприклад:
JLabel myLabel = new JLabel(
"Напис з товстою синьою рамкою");
myLabel.setBorder(BorderFactory.createLineBorder(Color.blue, 3));
Нижче приведені основні статичні методи класу BorderFactory для створення рамок різних типів:
метод public static Border createEmptyBorder() створює порожню рамку з нульовими розмірами, а статичний метод public static Border createEmptyBorder (int top, int left, int bottom, int right) - порожню рамку із заданими розмірами;
методи public static Border createLineBorder(Color color) і public static Border createLineBorder(Color color, int thickness) створюють відповідно рамку із заданим кольором і рамку із заданим кольором заданої товщини;
метод public static Border createBevelBorder(int type) створює рамку заданого типа type (опуклого - BevelBorder.RAISED або увігнутого - BevelBorder.LOWERED), метод public static Border createBevelBorder(int type, Color highlight, Color shadow) створює рамку заданого типа із заданим світлим (highlight) і темним (shadow) кольором, а метод public static Border createBevelBorder(int type, Color highlightOuter, Color highlightInner, Color shadowOuter, Color shadowInner) створює об'ємну двобарвну рамку заданого типа (внутрішні лінії мають кольори highlightInner і shadowInner, а зовнішні - кольори highlightOuter і shadowOuter);
метод public static Border createEtchedBorder() створює стандартну врізану рамку з кольорами трохи світліше і трохи темніше за колір фону, метод public static Border createEtchedBorder(int type) створює врізану рамку (якщо type рівний EtchedBorder.RAISED) або що втиснула (якщо type рівний EtchedBorder.LOWERED), метод public static Border createEtchedBorder(Color highlight, Color shadow) задає кольори Ѐврізаної рамкиЀ, а метод public static Border createEtchedBorder(int type, Color highlight, Color shadow) об'єднує можливості двох попередніх методів;
рамка одного кольору, але з ліній різної товщини задається за допомогою методу public static MatteBorder createMatteBorder(int top, int left, int bottom, int right, Color color), де color - колір рамки, top, left, bottom і right - товщина рамки (у пікселях) відповідно зверху, зліва, знизу і справа, а метод public static MatteBorder createMatteBorder(int top, int left, int bottom, int right, Icon tileIcon) задає як рамку зображення tileIcon, що повторюється;
метод public static TitledBorder createTitledBorder(Border border, String title, int titleJustification, int titlePosition, Font titleFont, Color titleColor) задає для рамки border напис title шрифтом titleFont і кольори titleColor, вирівняну по горизонталі відповідно до значення titleJustification (одна із статичних констант класу TitledBorder: LEFT, CENTER, RIGHT, LEADING, TRAILING або DEFAULT_JUSTIFICATION - значення LEADING) і по вертикалі відповідності із значенням titlePosition (одна із статичних констант класу TitledBorder: ABOVE_TOP, TOP BELOW_TOP, ABOVE_BOTTOM, BOTTOM BELOW_BOTTOM або DEFAULT_POSITION - значення TOP). Решту п'яти методів createTitledBorder() містять окремі параметри або частину параметрів приведеного вище методу;
метод public static CompoundBorder createCompoundBorder(Border outsideBorder, Border insideBorder) використовується для створення рамки, що складається з двох вкладених рамок будь-яких типів.
Хоча бібліотека Swing надає безліч готових рамок і клас BorderFactory для їх швидкого створення, часто виникає необхідність сконструювати оригінальну рамку. Для її створення можна розширити абстрактний клас AbstractBorder, визначивши хоч би один конструктор, і перевизначивши методи paintBorder() і getBorderInsets(). Якщо рамка непрозора, то треба перевизначити метод isBorderOpaque() так, щоб він повертав true. Свою рамку можна створити, розширивши який-небудь клас рамок, наприклад, для рамки, що розширює клас TitledBorder, в заголовок можна вставити не напис, а компонент класу JComponent.
3. Порядок виконання роботи
Модифікувати програму, виконану в попередній лабораторній роботі, з перетворенням її в графічний додаток Swing по одному з приведених нижче варіантів. Для кожного використовуваного компоненту повинна бути задана спливаюча підказка.
Варіант 1
Малювання ліній в графічному вікні. Лінії починаються при натисненні кнопки миші і продовжуються при перетягуванні миші до тих пір, поки кнопка миші не буде відпущена. Колір лінії вибирається за допомогою меню. Кожен пункт меню є радіокнопкою і містить зображення квадратика відповідного кольору.
Варіант 2
Малювання прямокутників в графічному вікні. При натисненні кнопки миші фіксується лівий верхній кут прямокутника. При відпуску миші фіксується правий нижній кут прямокутника, і прямокутник промальовувався на екрані. Колір зафарбовування прямокутника задається за допомогою списку, що розкривається. Кожен пункт списку містить зображення квадратика відповідного кольору.
Варіант 3
Переміщення зображення в графічному вікні. Спочатку зображення знаходиться в центрі вікна. При натисненні однієї з чотирьох кнопок із стрілками вгору, вниз, вліво або управо зображення стрибкоподібно переміщається в цьому напрямі. Вид зображення вибирається за допомогою меню. Кожен пункт меню є радіокнопкою і містить зменшене зображення.
Варіант 4
Малювання багатокутників в графічному вікні. При клацанні мишею фіксується чергова точка багатокутника. При подвійному клацанні мишею дана крапка з'єднується з першою точкою багатокутника, і малювання багатокутника закінчується. Колір зафарбовування прямокутника задається за допомогою списку, що розкривається. Кожен пункт списку містить зображення квадратика відповідного кольору.
Варіант 5
Виведення послідовності символів в заданій точці графічного вікна. Координати введення x і у (у пікселях) задаються за допомогою текстових полів, а послідовність символів - за допомогою текстової області. Шрифт напису, що виводиться, вибирається за допомогою меню. Кожен пункт меню є радіокнопкою і містить назву шрифту, виконану за допомогою цього шрифту. Текстові поля повинні бути поміщені в рамку з написом "Введення координат", а текстова область - в рамку з написом "Введення рядка".
Варіант 6
Висновок в двох текстових рядках в графічному вікні поточних координат миші (x,y) при її переміщенні. Колір тексту, що виводиться, в кожному з текстових рядків задається за допомогою двох списків, що розкриваються. Кожен пункт списку містить зображення квадратика відповідного кольору.
Варіант 7
Зміна фігури в графічному вікні. Вибір однієї з фігур: трикутника, еліпса або квадрата виконується за допомогою меню. Кожен пункт меню є радіокнопкою і повинен містити зменшене зображення відповідної фігури. При натисненні кнопки з червоною межею завтовшки 3 пікселі і написом "Видалити" фігура повинна віддалятися з вікна.
Варіант 8
Зміна кольору замальованого прямокутника із закругленими кутами в графічному вікні. При виборі пунктів "Червоний", "Зелений" або "Синій" в списку, що розкривається, фігура повинна міняти колір зафарбовування відповідно на червоний, зелений або синій колір. Кожен пункт списку, що розкривається, повинен містити маленький квадратик відповідного кольору. При натисненні кпопки "Фон" фігура повинна бути кольори фону, при цьому кнопка повинна змінюватися з врізаною на ту, що втиснула з темно-зеленим і ясно-зеленим кольорами підсвічування.
Варіант 9
Перетягування фігури замальованого прямокутника в графічному вікні. Колір замальованого прямокутника задається за допомогою меню. Кожен пункт меню є радіокнопкою і містить маленький квадратик відповідного кольору. При натисненні кнопки миші на фігурі і переміщенні миші фігура переміщається услід за мишею. При відпуску кнопки миші позиція фігури фіксується. Координати x і у лівого верхнього кута прямокутника виводяться в двох текстових рядках.
Варіант 10
Переміщення фігури замальованого трикутника в графічному вікні. Спочатку фігура знаходиться в лівому верхньому кутку. Колір закрашеного прямокутника задається за допомогою розкриваючого списку. При клацанні мишею в якій-небудь точці вікна додатку фігура поміщається в цю крапку. Координати x і у лівого верхнього кута прямокутника виводяться в двох текстових полях, поміщених в рамку з написом "Виведення координат". Розмір написів (10, 12 або 14 pt), що виводяться, вибирається за допомогою меню.
Варіант 11
Зміна кольору замальованого трикутника і кольору фону в графічному вікні. Зміна кольору задається циклічно за допомогою кнопок "Фігура" і "Фон". Кнопки поміщені в рамку з написом зверху "Зміна кольору".
Варіант 12
При клацанні мишею по замальованого прямокутнику із закругленими кутами в текстовому рядку графічного вікна з'являється напис "Включено", а при повторному клацанні - напис "Вимкнено". Напис повинен бути поміщений в рамку з написом "Зміна стану".
Варіант 13
При введенні послідовності символів в текстовому полі в графічному вікні ця послідовність символів (після натиснення клавіші Enter) виводиться в текстовій області цього ж вікна, а текстове поле очищає...