Назад Зміст Вперед

11.6 Основи Swing. Використання JLabel

Swing — інструментарій для створення графічного інтерфейсу користувача (GUI) мовою програмування Java. Це частина бібліотеки базових класів Java (JFC, Java Foundation Classes).

Swing розробляли для забезпечення функціональнішого набору програмних компонентів для створення графічного інтерфейсу користувача, ніж у ранішого інструментарію AWT. Компоненти Swing підтримують специфічні look-and-feel модулі, що динамічно підключаються. Завдяки ним можлива емуляція графічного інтерфейсу платформи (тобто до компоненту можна динамічно підключити інші, специфічні для даної операційної системи вигляд і поведінку). Основним недоліком таких компонентів є відносно повільна робота, хоча останнім часом це не вдалося підтвердити через зростання потужності персональних комп'ютерів. Позитивна сторона — універсальність інтерфейсу створених програм на всіх платформах.

Наступний код демонструє основи використання Swing. Ця програма зображує вікно (JFrame), у вікні міститиметься кнопка з написом «Натисніть сюди» на ній та написом праворуч «Ця кнопка не робить нічого:».
package com.example;

// Імпортує swing і AWT класи
import java.awt.EventQueue;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;

/**
 * Простий приклад використання Swing
 */
public class SwingExample {
    public static void main(String[] args) {
        
        // Упевнюємося, що всі виклики Swing/AWT виконуються Event Dispatch Thread ("EDT")
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                // Створюємо JFrame, що має вигляд вікна з "декораціями", 
                // наприклад заголовком і кнопкою закриття
                JFrame f = new JFrame("Приклад вікна Swing");

                // Установлюємо простий менеджер розмітки, що впорядковує всі компоненти
                f.setLayout(new FlowLayout());

                // Додаємо компоненти
                f.add(new JLabel("Ця кнопка не робить нічого:"));
                f.add(new JButton("Натисніть сюди!"));

                // "Пакує" вікно, тобто робить його величину відповідну до її компонентів
                f.pack();

                // Встановлюємо стандартну операцію закриття для вікна, 
                // без цього вікно не закриється після активування кнопки закриття
                //  (Стандартно HIDE_ON_CLOSE, що просто приховує вікно)
                f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

                // Уснановлюємо видимість=істина, тим самим показуючи вікно на екрані
                f.setVisible(true);
            }
        });
    }
}

JLabel

Це найпростіший компонент, який є в Java Swing. За допомогою JLabel можна показати текст з іконкою. Якщо потрібен якийсь компонент, щоб відобразити якесь повідомлення користувачу або зробити для поля введення текстову мітку, або показати іконку - використовуємо JLabel. Текст, який показує JLabel виділяти не можна, тільки дивитися.
Для створення об'єкта JLabel, який потім будемо мати у своєму розпорядженні в вікні, можна скористатися конструктором з стрічковим параметром 
public JLabel (String text)
Стрічковий параметр - це текст, який буде показуватися в JLabel. Крім того текст, який буде відображатися в JLabel можна встановити за допомогою методу setText. Єдиним параметром методу є рядок тексту, що відображається String.

JLabel дозволяє налаштовувати шрифт, який буде використовуватися для відображення тексту. Установка шрифту відбувається за допомогою методу 
setFont класу JLabel
Цьому методу як параметр передається об'єкт Font
Що ми хочемо, коли вказуємо або створюємо шрифт? 
Перше - це накреслення, Verdana або Courier New, або інше. 
Друге - розмір шрифту і 
третє - жирний буде шрифт або нормальний, або може бути курсив. 
Тому відповідний конструктор для Font це той, який містить відразу всі три параметри - public Font (String name, int style, int size). Перший параметр, як вже зрозуміло, це ім'я шрифту. Якщо параметр не заданий, то використовується шрифт за замовчуванням. Другий параметр задає стиль - жирний, нормальний або курсив. Сюди необхідно передати одну з констант об'єкта Font - Font.BOLD (жирний), Font.PLAIN (нормальний або плоский) і Font.ITALIC (курсив). Ну і третій параметр - розмір шрифту. Об'єкт Font можна створити ось так:
Font font = new Font("Verdana", Font.PLAIN, 11);

Після установки тексту та шрифту у JLabel іноді буває потрібно визначити вирівнювання тексту по вертикалі і горизонталі. Робиться це за допомогою двох методів setVerticalAlignment і setHorizontalAlignment відповідно. Як параметри для setVerticalAlignment потрібно використовувати щось з наступного списку: 
JLabel.TOP (вирівнювати по верхньому краю), 
JLabel.CENTER (по центру) та 
JLabel.BOTTOM (вирівнювання по нижньому краю). 
Для методу setHorizontalAlignment параметрів більше - 
JLabel.LEFT (по лівому краю), 
JLabel.CENTER (по центру), 
JLabel.RIGHT (по правому краю), 
JLabel.LEADING і 
JLabel.TRAILING. 
Цікаві останні дві константи. Для мов, у яких написання тексту йде зліва на право JLabel.LEADING - це лівий край, а JLabel.TRAILING - правий. Для мов, у яких написання відбувається справа наліво, JLabel.LEADING - це правий край, а JLabel.TRAILING - лівий.

JLabel дозволяє відображати іконку разом з текстом. Для установки іконки використовується метод setIcon. Єдиний параметр методу - це об'єкт Icon. Коли задана іконка для JLabel, то можна задати розташування тексту щодо іконки. Для цього використовуються методи setVerticalTextPosition і setHorizontalTextPosition. Як параметри використовуються ті ж константи, що і при вирівнюванні тексту.

Йдемо далі. Шрифт ми вибрали. Тепер потрібно визначити, якого кольору буде текст у нашого JLabel. Робиться це за допомогою методу setForeground. Сюди потрібно передати об'єкт Color. Для створення Color можна скористатися різними конструкторами або замість цього скористатися константами, які визначені в об'єкті Color. Тут є чорний Color.BLACK, зелений Color.GREEN, червоний Color.RED і інші. Якщо потрібно створити якийсь специфічний колір, то доведеться скористатися конструктором. 
Наприклад, 
public Color (int red, int green, int blue)
Передаємо сюди необхідні складові кольору і отримуємо те, що хотіли. Ну а потім встановлюємо колір у JLabel.
label.setForeground (Color.GREEN);

Крім кольору шрифту можна задати колір фону JLabel. Робиться це за допомогою методу setBackground. Цікавий момент. За замовчуванням, навіть якщо колір фону встановлений, фон у JLabel не відображається. Для того, щоб JLabel став показувати фон необхідно викликати метод setOpaque і передати туди true. Тим самим ми скажемо JLabel, що хочемо зробити непрозорим його фон. Колір фону задається аналогічно кольором тексту, тобто методу setBackground передається об'єкт Color, який містить інформацію про колір.

У JLabel, як і у інших компонентів, можна встановлювати розміри. Робиться це за допомогою методу setPreferredSize. Сюди передається об'єкт Dimension з необхідною шириною і висотою.
label.setPreferredSize (new Dimension (100, 100));

Ще одна особливість, про яку потрібно обов'язково розповісти - це використання HTML в якості тексту. Наприклад, в тестовому додатку JLabel використовується для того, щоб показати короткий опис Google Labs англійською мовою.
Приклад методів.
На самій верхній панелі можна побачити результат роботи з методами, які встановлюють вирівнювання тексту JLabel. Для того, щоб було краще видно вирівнювання, додали до кожного JLabel чорний border шириною в один піксель. На середньої панелі - робота з позиціонуванням тексту JLabel щодо іконки і нарешті на найнижчій - використання HTML для відображення в JLabel тексту. Зовнішній вигляд програми представлений на малюнку нижче.
working_with_jlabel
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;

import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.Border;

public class TestFrame extends JFrame {

     public static void createGUI() {
          JFrame frame = new JFrame("Test frame");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          Dimension labelSize = new Dimension(80, 80);
         
          Border solidBorder = BorderFactory.createLineBorder(Color.BLACK, 1);
         
          JPanel mainPanel = new JPanel();
          mainPanel.setLayout(new BorderLayout());
         
          JPanel alignmentPanel = new JPanel(new FlowLayout());
          alignmentPanel.setBorder(BorderFactory.createTitledBorder("Alignment"));
         
          Font font = new Font("Verdana", Font.PLAIN, 12);
         
          JLabel topLabel = new JLabel("Top");
          topLabel.setVerticalAlignment(JLabel.TOP);
          topLabel.setHorizontalAlignment(JLabel.CENTER);
          topLabel.setPreferredSize(labelSize);
          topLabel.setBorder(solidBorder);
          topLabel.setFont(font);
          topLabel.setForeground(Color.GREEN);
          alignmentPanel.add(topLabel);
         
          font = new Font(null, Font.ITALIC, 13);
         
          JLabel bottomLabel = new JLabel("Bottom");
          bottomLabel.setVerticalAlignment(JLabel.BOTTOM);
          bottomLabel.setHorizontalAlignment(JLabel.CENTER);
          bottomLabel.setPreferredSize(labelSize);
          bottomLabel.setBorder(solidBorder);
          bottomLabel.setFont(font);
          bottomLabel.setForeground(Color.RED);
          alignmentPanel.add(bottomLabel);
         
          JLabel leftLabel = new JLabel("Left");
          leftLabel.setVerticalAlignment(JLabel.CENTER);
          leftLabel.setHorizontalAlignment(JLabel.LEFT);
          leftLabel.setPreferredSize(labelSize);
          leftLabel.setBorder(solidBorder);
          leftLabel.setForeground(Color.BLUE);
          alignmentPanel.add(leftLabel);
         
          font = new Font(null, Font.BOLD, 10);
         
          JLabel rightLabel = new JLabel("Right");
          rightLabel.setVerticalAlignment(JLabel.CENTER);
          rightLabel.setHorizontalAlignment(JLabel.RIGHT);
          rightLabel.setPreferredSize(labelSize);
          rightLabel.setBorder(solidBorder);
          rightLabel.setForeground(Color.GRAY);
          rightLabel.setFont(font);
          alignmentPanel.add(rightLabel);
         
          font = new Font("Century Gothic", Font.BOLD, 14);
         
          JLabel centerLabel = new JLabel("Center");
          centerLabel.setVerticalAlignment(JLabel.CENTER);
          centerLabel.setHorizontalAlignment(JLabel.CENTER);
          centerLabel.setPreferredSize(labelSize);
          centerLabel.setBorder(solidBorder);
          centerLabel.setFont(font);
          alignmentPanel.add(centerLabel);
         
          mainPanel.add(alignmentPanel, BorderLayout.NORTH);
         
          JPanel textPositionPanel = new JPanel();
          textPositionPanel.setBorder(
                    BorderFactory.createTitledBorder("Text position"));
         
          Icon icon = UIManager.getIcon("OptionPane.errorIcon");
         
          JLabel textPosLeftTopLabel = new JLabel("LT");
          textPosLeftTopLabel.setVerticalTextPosition(JLabel.TOP);
          textPosLeftTopLabel.setHorizontalTextPosition(JLabel.LEFT);
          textPosLeftTopLabel.setPreferredSize(labelSize);
          textPosLeftTopLabel.setBorder(solidBorder);
          textPosLeftTopLabel.setIcon(icon);        
          textPositionPanel.add(textPosLeftTopLabel);
         
          icon = UIManager.getIcon("OptionPane.informationIcon");
         
          JLabel textPosLeftBottomLabel = new JLabel("LB");
          textPosLeftBottomLabel.setVerticalTextPosition(JLabel.BOTTOM);
          textPosLeftBottomLabel.setHorizontalTextPosition(JLabel.LEFT);
          textPosLeftBottomLabel.setPreferredSize(labelSize);
          textPosLeftBottomLabel.setBorder(solidBorder);
          textPosLeftBottomLabel.setIcon(icon);        
          textPositionPanel.add(textPosLeftBottomLabel);
         
          icon = UIManager.getIcon("OptionPane.questionIcon");
         
          JLabel textPosRightTopLabel = new JLabel("RT");
          textPosRightTopLabel.setVerticalTextPosition(JLabel.TOP);
          textPosRightTopLabel.setHorizontalTextPosition(JLabel.RIGHT);
          textPosRightTopLabel.setPreferredSize(labelSize);
          textPosRightTopLabel.setBorder(solidBorder);
          textPosRightTopLabel.setIcon(icon);        
          textPositionPanel.add(textPosRightTopLabel);
         
          icon = UIManager.getIcon("OptionPane.errorIcon");
         
          JLabel textPosRightBottomLabel = new JLabel("RB");
          textPosRightBottomLabel.setVerticalTextPosition(JLabel.BOTTOM);
          textPosRightBottomLabel.setHorizontalTextPosition(JLabel.RIGHT);
          textPosRightBottomLabel.setPreferredSize(labelSize);
          textPosRightBottomLabel.setBorder(solidBorder);
          textPosRightBottomLabel.setIcon(icon);        
          textPositionPanel.add(textPosRightBottomLabel);
         
          icon = UIManager.getIcon("OptionPane.informationIcon");
         
          JLabel textPosCenterLabel = new JLabel("Center top");
          textPosCenterLabel.setVerticalTextPosition(JLabel.TOP);
          textPosCenterLabel.setHorizontalTextPosition(JLabel.CENTER);
          textPosCenterLabel.setPreferredSize(labelSize);
          textPosCenterLabel.setBorder(solidBorder);
          textPosCenterLabel.setIcon(icon);        
          textPositionPanel.add(textPosCenterLabel);                  
         
          mainPanel.add(textPositionPanel, BorderLayout.CENTER);
         
          JPanel htmlPanel = new JPanel();
          htmlPanel.setBorder(BorderFactory.createTitledBorder("HTML"));
         
          String text = "<html><h2>What is Google Labs?</h2>" +
                    "<font face=’verdana’ size = 2>" +
                    " Google Labs is a playground <br>" +
                    " where our more adventurous users can play around with <br>" +
                    " prototypes of some of our wild and crazy ideas and <br>" +
                    " offer feedback directly to the engineers who developed<br>" +
                    " them. Please note that Labs is the first phase in <br>" +
                    " a lengthy product development process and none of this <br>" +
                    " stuff is guaranteed to make it onto Google.com. <br>" +
                    " While some of our crazy ideas might grow into the <br>" +
                    " next Gmail or iGoogle, others might turn out to be, <br>" +
                    " well, just plain crazy.</html>";
         
          font = new Font(null, Font.PLAIN, 10);
         
          JLabel htmlLabel = new JLabel();
          htmlLabel.setText(text);
          htmlLabel.setFont(font);
          htmlPanel.add(htmlLabel);
         
          mainPanel.add(htmlPanel, BorderLayout.SOUTH);

          frame.getContentPane().add(mainPanel);
          frame.setPreferredSize(new Dimension(450, 485));
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
     }

     public static void main(String[] args) {
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                    JFrame.setDefaultLookAndFeelDecorated(true);
                    createGUI();
               }
          });
     }
}


.