Перейти до вмісту

Освоюємо Java/Графічні компоненти Swing

Матеріал з Вікіпідручника

Swing містить великий набір компонентів для розробки графічного інтерфейсу користувача (GUI). Оскільки Swing більш повний інструментарій ніж AWT, тому в книзі основна увага буде приділена саме йому. Робота з AWT компонентами майже аналогічна, щоправда їх дещо менше. Для розрізнення компонентів інтрументаріїв, компоненти Swing містять літеру «J» спереду назви (JButton, JPanel і т.п.). Назви AWT компоненти не мають даної літери спереду.

Swing та AWT є частиною JFC (Java Foundation Classes), що в свою чергу становить левову частку стандартної платформи Java. Класи Swing розміщуються в пакеті javax.swing та його підпакетах. Суфікс –х прийняти ставити для нестандартних розширень, проте дані пакети є стандартними починаючи з JDK 1.2.

В попередньому розділі розглянуто основні особливості створення графічного інтерфейсу користувача. Даний розділ буде присвячений графічним компонентам, які ви можете використовувати для створення інтерфейсу.

Мітки

[ред.]

Мітка (JLabel) – це рядок тексту або зображення, що розміщується в компоненті. Це один з найпростіших компонентів графічного інтерфейсу. Вони дозволяють задавати вирівнювання тексту (вправо, зліва, по-центру) в середині компонента та не мають особливих подій, які б асоціювалися з ними.

Наступний код демонструє різноманітні способи створення міток.

Результат виконання Labels.java
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. Наступний приклад демонструє створення кнопки із зображенням та обробки події натиснення кнопки.

Кнопка з лічильником до і після натиснення (PictureButton.java)
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("&nbsp &nbsp"+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();
    JPanel southPanel= new JPanel();
    Container westBox= Box.createVerticalBox(); 
    Container southBox= Box.createVerticalBox(); 
    Component strut=Box.createVerticalStrut(10);

    Component glue=Box.createVerticalGlue();
    //Створюємо прапорці
    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();
    JLabel chooseLabel1=new JLabel();
    JButton confirmButton=new JButton("Підтвердити");
    
    
    JFrame myframe=this;
    FormFrame(){
       // myframe=this;
        // встановити менеджер розташування BorderLayout
        setLayout(new BorderLayout());

        // північна панель
        northPanel.add(new JLabel("Анкета"));
        northPanel.setBackground(Color.red);
        // західна панель
        
        westBox.add(new JLabel("Що вас цікавить?"));
        westBox.add(comps);
        westBox.add(netBooks);
        westBox.add(notebook);
        westBox.add(foto);
        westBox.add(video);
        westBox.add(printers);
        
         
        //східна панель
         final ButtonGroup radioGroup=new ButtonGroup();
     
        
        Container eastBox= Box.createVerticalBox(); 
        
        //створєюмо і додаємо прапорці у східну панель
        eastBox.add(new JLabel("Ваш вік?"));
        JRadioButton radioButton;
        
        eastBox.add(radioButton=new JRadioButton("-"));
        radioButton.setSelected(true);
        radioButton.setActionCommand("-");
        radioGroup.add(radioButton);
        eastBox.add(radioButton=new JRadioButton("12..18"));
        radioButton.setActionCommand("12..18");
        radioGroup.add(radioButton);
        eastBox.add(radioButton=new JRadioButton("19..30"));
        radioButton.setActionCommand("19..30");
        radioGroup.add(radioButton);
        eastBox.add(radioButton=new JRadioButton("30..60"));
        radioButton.setActionCommand("30..60");
        radioGroup.add(radioButton);
        eastBox.add(radioButton=new JRadioButton(">60"));
        radioButton.setActionCommand(">60");
        radioGroup.add(radioButton);
        
        //південь

        
        confirmButton.setAlignmentX(JComponent.CENTER_ALIGNMENT); 
        southBox.add(confirmButton);
        chooseLabel1.setAlignmentX(JComponent.CENTER_ALIGNMENT);
        southBox.add(chooseLabel1);
        chooseLabel.setAlignmentX(JComponent.CENTER_ALIGNMENT);
        southBox.add(strut); 
        southBox.add(chooseLabel);
        southBox.add(glue);
             
        // додати панелі у відповідні сторони вікна
        add(northPanel, BorderLayout.NORTH); 
        add(westBox, BorderLayout.WEST); 
        add(eastBox, BorderLayout.CENTER); 
        add(southBox, BorderLayout.SOUTH); 
        
        confirmButton.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed (ActionEvent ae){
                String compClass, labelText="<HTML> Ви вибрали: <br/>";
                                
                //Визначити яку радіокнопку було натиснуто  
                //і вивести повідомлення з кількістю років
                String radioCommand=radioGroup.getSelection().getActionCommand();
                System.out.println(radioCommand);
                String labelText1="Вам "+radioCommand+" років";
                chooseLabel1.setText(labelText1);
                
                // отримати компоненти, що містяться в контейнері західній панелі-box
                // і вивести повідомлення, які прапорці вибрані            
                Component[] components= westBox.getComponents();

                for (int i=0; i<components.length; i++){
                    compClass=components[i].getClass().toString();
                    if (compClass.equalsIgnoreCase("class javax.swing.JCheckBox")){
                        JCheckBox cb = (JCheckBox)components[i];
                        if (cb.isSelected()) {
                           labelText=labelText.concat("&nbsp &nbsp"+cb.getText()+"<br>");
                        }
                    }
                }
                    
            chooseLabel.setText(labelText);

            }//actionPerformed() 
        });
    }//formFrame()
        
}//FormFrame

Lists

[ред.]

(ще не написано)

Комбіновані списки

[ред.]

Комбінований список (combo box)— це компонент графічного інтерфейсу користувача (ГІК), що поєднує в собі текстове поле та випадний список. Компонент дозволяє або ввести необхідне значення у полі, або вибрати його із випадного списку. Комбіновані списки є альтернативою радіокнопкам. Перевагою є можливість додання великої кількості пунктів вибору і при цьому компонент займає небагато місця на екрані.

В Swing комбінований список реалізовує клас JComboBox. Комбінований список може бути в двох режимах: з можливість друку значення варіанту і без такої можливості. Для встановлення відповідного стану слугує метод setEditable(). Таким чином в компоненті можна буде друкувати як в звичайному текстовому полі, здійснюючи швидкий вибір пункту.

Пункти меню можна задати як в конструкторі так і додавати кожен пункт окремо методом addItem(String item):

String[] items={"Жовтий", "Синій", "Червоний"};
combo = new JComboBox(items);
combo.setEditable(true);

або:

combo = new JComboBox();
combo.setEditable(true);
combo.addItem("Синій");
combo.addItem("Жовтий");
combo.addItem("Червоний");

Пункти можна також вставляти за індексом в списку:

combo.insertItemAt("Світлосірий", 5);

Також можна видаляти пункти зі списку:

combo.removeItem("red");
combo.removeItemAt(0);

Повністю видалити всі пункти можна з допомогою методу removeAllItems().

Коли користувач вибирає певний пункт комбінованого списку, генерується подія ActionEvent. В обробнику подій можна визначити, що саме викликало подію методом getSource() застосувавши його до екземпляра події. Даний метод поверне посилання на об’єкт ComboBox. Далі об’єктну змінну можна використати для визначення пункту, який був вибраний методом getSelectedItem():

public void actionPerformed(ActionEvent event)
            {
                Object srs=event.getSource();
                JComboBox combo=(JComboBox)srs;
                if(combo.getSelectedItem().equals("Синій")) 
                    panel.setBackground(Color.BLUE); 
.
}

Наступна програма виводить список із кольорами, при виборі певного кольору колір панелі змінюється на вибраний:

Вибрано зелений колір фону
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestComboBox {
     public static void main(String[] args){
         ComboBoxFrame frame=new ComboBoxFrame();
         frame.setSize(250,225);
         frame.setTitle("TestComboBox");
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.setVisible(true);   
     }
}

class ComboBoxFrame extends JFrame {
    JPanel panel=new JPanel();
    JComboBox combo;
            
    ComboBoxFrame(){
           
        //створюємо комбінований список і додаємо пункти
        combo = new JComboBox();
        combo.setEditable(true);
        combo.addItem("Виберіть колір");
        combo.addItem("Синій");
        combo.addItem("Жовтий");
        combo.addItem("Червоний");
        combo.addItem("Зелений");
        combo.addItem("Білий");
        combo.addItem("Світлосірий");
        combo.addItem("Розовий");
        combo.addItem("Голубий");
 
        //додаємо обробника подій
        combo.addActionListener(new ActionListener(){
          //реалізовуємо метод обробки події  
          public void actionPerformed(ActionEvent event)
            {
                if(combo.getSelectedItem().equals("Синій")) 
                    panel.setBackground(Color.BLUE);
                if(combo.getSelectedItem().equals("Жовтий")) 
                    panel.setBackground(Color.YELLOW);
                if(combo.getSelectedItem().equals("Червоний")) 
                    panel.setBackground(Color.RED);
                if(combo.getSelectedItem().equals("Білий")) 
                    panel.setBackground(Color.WHITE);
                if(combo.getSelectedItem().equals("Світлосірий")) 
                    panel.setBackground(Color.LIGHT_GRAY);
                if(combo.getSelectedItem().equals("Зелений")) 
                    panel.setBackground(Color.GREEN);   
                if(combo.getSelectedItem().equals("Розовий")) 
                    panel.setBackground(Color.PINK);
                if(combo.getSelectedItem().equals("Голубий")) 
                    panel.setBackground(Color.CYAN);  
            }});
        
        
        panel.add(combo); // додаємо список до панелі
        this.add(panel);  //додаємо панель у фрейм
           
    }

}

Зовнішній вигляд комбінованого боксу можна дещо модифікувати визначивши спеціальний візуалізатор(custom renderer). Візуалізатор для комбінованого боксу повинен реалізовувати інтерфейс ListCellRenderer. Якщо компонент редагований, то редактор комбінованого боксу повинен реалізовувати інтерфейс ComboBoxEditor.

Детальніше дивіться офіційний Java посібник: How to Use Combo Boxes

Borders

[ред.]

(ще не написано)

Меню

[ред.]

Стандартне меню в java реалізоване в класі JMenu. Меню може містити пункти меню, які можуть містити власні пункти утворюючи підменю. Для того щоб розмістити основні меню в горизонтальну смугу використовується клас JMenuBar. Рядок меню можна розмістити не тільки зверху вікна, але і знизу і посередині. Розглянемо сказане детальніше.

Таким чином спочатку створюється рядок меню:

JMenuBar menuBar = new JMenuBar();

Щоб помістити рядок меню у верхню частину фрейму, пишеться:

frame.SetJMenuBar(menuBar);

Далі залишається заповнити його відповідними меню. Для цього для кожного меню створюється свій об’єкт:

JMenu fileMenu=new JMenu(Файл);
JMenu editMenu=new JMenu(Редагувати);

Далі усі основні меню додають до рядка меню:

menuBar.add(fileMenu);
menuBar.add(editMenu);

Аналогічно додаємо до меню пункти:

JMenu fileMenu = new JMenu("Файл");
menuBar.add(fileMenu);
JMenuItem openItem = new JMenuItem ("Відкрити");
fileMenu.add(openItem);

Також між пунктами меню можна поставити горизонтальну лінію (розділювач):

fileMenu.addSeparator().


До кожного пункту меню можна додати зображення та свій обробник події, призначити гарячі клавіші.

Наступна програма демонструє створення меню, створення обробника подій, додавання до пункту меню зображення та гарячої клавіші.

ProgramMenu.java
import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.*;

public class ProgramMenu {
         public static final int DEFAULT_WIDTH = 300;
         public static final int DEFAULT_HEIGHT = 200;

    public static void main(String[] args) {
        //створюємо фрейм
        JFrame frame = new JFrame();
        frame.setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //додаємо меню
        frame.add(new Menu(frame));
        frame.setVisible(true);
        

    }
}

class Menu extends JMenuBar{  
    public Menu(JFrame frame ){
       //створюємо рядок меню
       JMenuBar menuBar = new JMenuBar();
       //додаємо рядок меню у фрейм
       frame.setJMenuBar(menuBar);
       
       //Меню "Файл"
       JMenu fileMenu = new JMenu("Файл");
       menuBar.add(fileMenu);
       //додаємо пункти в меню файл
       JMenuItem openItem = new JMenuItem ("Відкрити");
       fileMenu.add(openItem);
       //додаємо розділювач
       fileMenu.addSeparator();

       
       JMenuItem saveItem = new JMenuItem ("Зберегти");
       fileMenu.add(saveItem);
       
       //створити меню "закрити" в якому поряд з написом буде зображення
       JMenuItem closeItem = new JMenuItem ("Закрити", new ImageIcon("CloseIcon.jpg"));
       fileMenu.add(closeItem);
       //додаємо обробник подій використавши безіменний внутрішній клас
       closeItem.addActionListener(new ActionListener( ) {
            @Override
            public void actionPerformed(ActionEvent e) { System.exit(0); }
        });
       
       
       // додаємо гарячу клавіші Ctrl-X до пункту "Закрити" 
        closeItem.setAccelerator(
                KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.CTRL_MASK));
          
       // меню "Вигляд"
       JMenu viewMenu = new JMenu("Вигляд");
       menuBar.add(viewMenu);
       
       // меню "Допомога"
       JMenu helpMenu = new JMenu("Допомога");
       menuBar.add(helpMenu);
       // можна використати метод add() 
       // для додавання пунктів в меню зразу ж при створенні
       JMenuItem helpItem = helpMenu.add("Довідка");
       JMenuItem aboutItem = helpMenu.add("Про програму");      
    }   
}

Спливаюче меню

[ред.]

(ще не написано)

Панель прокрутки

[ред.]
Результат використання JScrollPane із текстовою областю

Для того щоб реалізувати прокручування вмісту існує клас JScrollPane (Scroll Pane можна перекласти як панель прокрутки). JScrollPane дозволяє в разі наявності вмісту для прокручування додати вертикальну та горизонтальну смуги прокрутки (англ. scrollbars), з якими добре знайомий кожен користувач комп'ютера.

Додавання прокрутки здійснюється доволі просто. Достатньо лише при створенні екземпляру JScrollPane вказати для якої компоненти потрібні додати смуги прокрутки. Після чого панель прокрутки (а не компоненту!) додаємо у відповідний контейнер. Наприклад оточити текстову область смугами прокрутки, можна таким чином:

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class TestJScrollPane extends JFrame{

	
	TestJScrollPane(){
	      //створюємо панель
	        JPanel panel =new JPanel();
	        //додаємо панель у фрейм
	        add(panel);
	        //створюємо текству область 5x30 символів
	        JTextArea textArea = new JTextArea(5, 30);
	        //додаємо рамку до текствої області
	        textArea.setBorder(BorderFactory.createLineBorder(Color.BLACK));
	        // створюємо і додаємо панель прокрутки,
	        JScrollPane scrollPane = new JScrollPane(textArea);
	        panel.add(scrollPane, BorderLayout.CENTER);
	    }
	  public static void main(String[] args) {
	      //створюємо frame
	        JFrame frame=new TestJScrollPane();
	        frame.setSize(400, 200);
	        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	        frame.setTitle("Test JScrollPane");
	        frame.setVisible(true);  
	    }
	
}

Існують методи, для невеликої корекції вигляду та поведінки елементів панелі прокрутки.

The JSplitPane Class

[ред.]

(ще не написано)

Вкладки

[ред.]

За створенням вкладок відповідає клас JTabbedPane. Це контейнер з поміченими вкладками.

Кожна вкладка має ім’я і є звичайним контейнером. Щоб додати вкладку до JTabbedPane, просто викличте метод addTab(мітка_вкладки, екземпляр_контейнера). Зауважте, що хоча одночасно показується одна вкладка, всі інші вкладки також завантажені в пам’ять. Тому, якщо пам’ять для вас є критичним ресурсом, то необхідно вжити відповідних заходів із звільнення пам’яті.

Результат виконання TestTabbedPane.java
import javax.swing.*;

public class TestTabbedPane {
    
    public static final int FRAME_WIDTH = 350;
    public static final int FRAME_HEIGHT = 200;

    public static void main(String[] args) {
        //створюємо вкладку
        JFrame frame = new JFrame();
        frame.setTitle ("Test Tabbed Pane");
        frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
        JTabbedPane tabby = new JTabbedPane();
        
        //створюємо панелі для вкладок
        JPanel panel1= new JPanel();
        JPanel panel2 = new JPanel();      
        
        //додаємо на першу вкладку групу радіокнопок
        ButtonGroup radioGroup=new ButtonGroup();
        panel1.add(new JLabel("Ваш вік?"));
        JRadioButton radioButton;
        panel1.add(radioButton=new JRadioButton("12..18"));
        radioGroup.add(radioButton);
        panel1.add(radioButton=new JRadioButton("19..30"));
        radioGroup.add(radioButton);
        panel1.add(radioButton=new JRadioButton("30..60"));
        radioGroup.add(radioButton);
        
        //на другу панель додаємо просто напис
        panel2.add(new JLabel("Друга вкладка"));
        
        //додаємо панелі у JTabbedPane
        tabby.addTab("Перша", panel1);
        tabby.addTab("Друга", panel2);
        
        // додаємо вкладки у фрейм
        frame.add(tabby);
        frame.setVisible(true);

    }
}

Scrollbars and Sliders

[ред.]

(ще не написано)

Dialogs

[ред.]

(ще не написано)

File Selection Dialog

[ред.]

(ще не написано)

Text Components

[ред.]

(ще не написано)

Trees

[ред.]

(ще не написано)

Tables

[ред.]

(ще не написано)

Менеджери розташування · Аплети