Swing містить великий набір компонентів для розробки графічного інтерфейсу користувача (GUI). Оскільки Swing більш повний інструментарій ніж AWT, тому в книзі основна увага буде приділена саме йому. Робота з AWT компонентами майже аналогічна, щоправда їх дещо менше. Для розрізнення компонентів інтрументаріїв, компоненти Swing містять літеру «J» спереду назви (JButton, JPanel і т.п.). Назви AWT компоненти не мають даної літери спереду.
Swing та AWT є частиною JFC (Java Foundation Classes), що в свою чергу становить левову частку стандартної платформи Java. Класи Swing розміщуються в пакеті javax.swing та його підпакетах. Суфікс –х прийняти ставити для нестандартних розширень, проте дані пакети є стандартними починаючи з JDK 1.2.
В попередньому розділі розглянуто основні особливості створення графічного інтерфейсу користувача. Даний розділ буде присвячений графічним компонентам, які ви можете використовувати для створення інтерфейсу.
Мітки Мітка (JLabel) – це рядок тексту або зображення, що розміщується в компоненті. Це один з найпростіших компонентів графічного інтерфейсу. Вони дозволяють задавати вирівнювання тексту (вправо, зліва, по-центру) в середині компонента та не мають особливих подій, які б асоціювалися з ними.
Наступний код демонструє різноманітні способи створення міток.
import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants;
public class Labels { public static void main(String[] args) { LabelFrame frame = new LabelFrame(); frame.setSize(150, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true);
class LabelFrame extends JFrame{ //створюємо панель JPanel panel=new JPanel();
LabelFrame(){ // вирівнювання за замовчуванням (CENTER) JLabel label1 = new JLabel("Багато левів, "); // вирівнювання вліво JLabel label2 = new JLabel("тигрів з тигрицями", SwingConstants.LEFT); // мітка без тексту, вирівнювання за замовчуванням JLabel label3 = new JLabel(); // створюємо іконку Icon icon = new ImageIcon("icon.gif"); // створюємо мітку із зображенням JLabel label4 = new JLabel(icon); // задаємо текст для label3 label3.setText("і ведмедів"); // встановлюємо вирівнювання label3.setHorizontalAlignment(SwingConstants.RIGHT); //додаємо мітки в панель panel.add(label1); panel.add(label2); panel.add(label3); panel.add(label4); //додаємо панель у фрейм this.add(panel);
Константи вирівнювання визначені в інтерфейсі SwingConstants. Щоправда вирівнювання тексту відбувається всередині компоненти Label, тому коли компонента підганяється під розмір вмісту, вирівнювання непомітне.
Для зміни кольору і шрифту в класі Component існують методи setFont() та setColor(), які застосовуються не тільки для міток, але й для будь-яких компонентів.
В тексті мітки можливе також застосування HTML: JLabel label=new JLabel ("<html>"+ "S<font size=-2>MALL");
Кнопки Кнопки вже застосовувалися раніше у прикладах. У Swing їх реалізовує компонент JButton. Кнопка генерує подію ActionEvent, коли на неї натискають. Щоб обробити цю подію в програмі реєструється відповідний обробник ActionListener, який повинен реалізовувати метод actionPerformed(). Метод actionPerformed отримує в якості аргумента подію, що відбулася. Крім мітки на кнопці може бути розміщене зображення. Клас JButton має відповідний конструктор для задання напису, зображення або обох зразу. Завантаження зображення здійснює зручний у використанні клас ImageIcon. Наступний приклад демонструє створення кнопки із зображенням та обробки події натиснення кнопки.
import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel;
public class PictureButton {
public static void main(String[] args) { ButtonFrame frame = new ButtonFrame(); frame.setSize(300, 100); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true);
class ButtonFrame extends JFrame{
JLabel label=new JLabel(); int i=0;
ButtonFrame(){ Icon icon = new ImageIcon("icon.gif"); JButton button = new JButton(icon); // додаємо обробник подій, що визначається у внутрішньому класі button.addActionListener(new ActionListener( ) { public void actionPerformed(ActionEvent ae) { i++; label.setText("Натиснуто разів: "+ i);
}); //встанолюємо менеджер розташування setLayout(new FlowLayout( )); add(button); add(label);
Якщо ми не використовуємо панелі, то при розміщенні компонентів напряму у фрейм необхідно встановити менеджер розташування, який керує розміщенням елементів один відносно одного (дивіться розділ про менеджери розташування). JFrame немає менеджера розташування по замовчуванню. У JPanel використовується по замовчуванню FlowLayout. Це найпростіший менеджер, який розміщує компоненти один за одним.
Необхідно зазначити, що при натисненні кнопки чи іншого компонента в джава генерується відповідний рядок «діюча команда» чи по іншому «команда дії» (action command). Це просто рядок (String), що дозволяє ідентифікувати компонент, що надсилає подію. По замовчуванню у JButton діюча команда та ж, що і мітка кнопки.
Щоб отримати діючу команду з події, необхідно викликати метод getActionCommand() для відповідної події. Наступний код визначає чи натиснута клавіша Yes: public void actionPerformed(ActionEvent e){ if (e.getActionCommand( ).equals("Yes") { //the user pressed "Yes"; do something ...
Можна змінити діючу команду викликавши метод кнопки setActionCommand(). Наступний рядок змінює команду на «confirm»: myButton.setActionCommand("confirm");
Використання для кнопок відмінних від їхніх міток діючих команд дозволяє полегшити інтернаціоналізацію інтерфейсу команд. Тобто переведення інтерфейсу з однієї мови на іншу. Так назви кнопок можуть бути записані у файл, який запросто може модифікуватися і його зміна не призведе до необхідності переписування коду програми. Таким чином перекладом інтерфейсу на іншу мову можуть здійснювати і непрограмісти.
Як і у компонента JLabel, написи у JButton можна задавати за допомогою HTML: JButton htmlButton = new JButton( "<html>" + "В<font size=-1>икористовуємо<font size=+0> " + "<br> HTML");
Прапорці Прапорець (Checkbox) слугує для вибору певної опції. Ви доволі часто їх зустрічаєте при заповненні різноманітних форм і при користуванні комп’ютером. Вони мають два стани: вибрано і невибрано (або ввімкнено і вимкнено). В Swing прапорці реалізовує компонент JCheckBox. При його створенні необхідно вказати мітку для роз’яснення, що задається в конструкторі: bold = new JCheckBox("Bold"); Щоб задати стан пропорця, можна скористатися методом setSelected(): bold.setSelected(true); При ввімкненні чи вимкненні опції користувачем, JCheckBox генерує подію ItemEvent. Для її обробки необхідно реалізувати інтерфейс ItemListener. Даний інтерфейс визначає метод itemStateChanged(), якому через параметр передається згенерований об'єкт ItemEvent. Також, оскільки даний компонент є своєрідним аналогом кнопки, то він породжує і ActionEvent, тож можна обробляти подію і як звичайну кнопку реалізувавши ActionListener (метод actionPerformed()) .
Для перевірки, стану прапорця слугує метод isSelected().
В наступному прикладі здійснюється обробка ItemEvent. Програма виводить ряд прапорців, при зміні стану котрогось з них знизу виводиться список вибраних прапорців.
import java.awt.Component; import java.awt.Container; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.Box; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel;
public class CheckboxForm {
public static void main(String[] args) { CheckFrame frame = new CheckFrame(); frame.setSize(180, 350); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true);
class CheckFrame extends JFrame implements ItemListener{
Container box=Box.createVerticalBox();
JCheckBox comps=new JCheckBox ("Комп'ютери"); JCheckBox netBooks=new JCheckBox ("Нетбуки"); JCheckBox notebook=new JCheckBox ("Ноутбуки"); JCheckBox foto=new JCheckBox ("Фотоапарати"); JCheckBox video=new JCheckBox ("Відеокамери"); JCheckBox printers=new JCheckBox ("Принтери"); JLabel chooseLabel=new JLabel();
CheckFrame(){
comps.addItemListener(this); netBooks.addItemListener(this); notebook.addItemListener(this); foto.addItemListener(this); video.addItemListener(this); printers.addItemListener(this);
box.add(new JLabel("Що Вас цікавить?")); box.add(comps); box.add(netBooks); box.add(notebook); box.add(foto); box.add(video); box.add(printers); box.add(new JLabel("Вас цікавить:")); box.add(chooseLabel);
this.add(box);
}//CheckFrame()
@Override public void itemStateChanged (ItemEvent ie){ String compClass, labelText="<HTML>"; // отримати компоненти, що містяться в контейнері box Component[] components= box.getComponents();
for (int i=0; i<components.length; i++){ // отримати назву класу компонента compClass=components[i].getClass().toString();
//якщо назва класу JCheckBox і стан "вибрано", //то в labelText дописати назву прапорця if (compClass.equalsIgnoreCase("class javax.swing.JCheckBox")){ JCheckBox cb = (JCheckBox)components[i]; if (cb.isSelected()) { labelText=labelText.concat("   "+cb.getText()+"<br>");
// оновити текст мітки, що виводить вибрані прапорці chooseLabel.setText(labelText); }//itemStateChanged()
}//CheckFrame
Для виведення компонентів в стопчик, вони були поміщені у вертикальний контейнер Box. (див. менеджер розташування BoxLayout).
Загальна інформація про JCheckBox:
javax.swing.JCheckBox 1.2 JCheckBox(String label) JCheckBox(String label, Icon icon) Створюють прапорець з невибраним станом JCheckBox(String label, boolean state) Створює прапорець з вказаною міткою та станом «вибрано» boolean isSelected () void setSelected(boolean state) Отримати або встановити стан прапорця
Радіокнопки Радіокнопка (англ. Radio button) — елемент графічного інтерфейсу користувача, що дозволяє користувачеві вибрати тільки один з елементів набору. Також заст. термін перемикач, проте він же часто застосовується і для прапорців.
Назва походить від фізичних кнопок, що використовувалися на старих автомобільних радіоприймачах для вибору наперед встановлених станцій, в яких коли натискалась якась кнопка інші затиснуті вискакували, тож залишалася лише одна натиснута кнопка.
Радіокнопки об'єднуються в групи з двох або більше і зображуються на екрані зазвичай у вигляді круглих отворів, які можуть бути порожні(не вибрано) або містять точку (обрано). Поряд з кожною радіокнопкою, як правило, показані заголовки з описом, що кожен варіант означає. Коли користувач вибирає котрийсь варіант, то вибір з інших варіантів автоматично знімається. Вибір варіанту можна зробити, клацнувши кнопкою миші на радіокнопці або заголовку, а також за допомогою клавіш.
У Swing радіокнопку реалізовує клас JRadioButton. Для групування радіокнопок застосовується клас ButtonGroup. Наступна програма демонструє використання радіокнопок.
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Box; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton;
public class Form {
public static void main(String[] args) { FormFrame frame = new FormFrame(); frame.setSize(200, 350); frame.setTitle("Form v1.0"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); // frame.pack();
class FormFrame extends JFrame { JPanel northPanel = new JPanel(); JPanel westPanel= new JPanel(); JPanel eastPanel = new JPanel();