Тема: Робота з графічними компонентами в програмах на мові Java
Для реалізації графічного інтерфейсу (GUI) в Java існують два основні пакети класів:
Перевагами першого є простота використання, інтерфейс подібний до інтерфейсу операційної системи та дещо краща швидкодія, оскільки базується на засобах ОС, щоправда має обмежений набір графічних елементів. Другий пакет Swing реалізує власний Java інтерфейс. Даний пакет створювався на основі AWT, і має набагато більше можливостей та більшу кількість графічних елементів. [2]. Swing-компоненти ще називають полегшеними (англ. lightweight), оскільки вони написані повністю на Java і, через це, платформонезалежні.
Вікно верхнього рівня (таке що не містить в середині іншого вікна) в мові Java називається фреймом (frame - каркас). В бібліотеці AWT для цього вікна призначений клас Frame, а в бібліотеці Swing — JFrame.
Наступний код демонструє, як можна створити фрейм розміром 300х200 пікселів:
import javax.swing.JFrame;
public class SimpleFrame
{
public static void main(String[] args)
{
JFrame frame = new JFrame(); // створити фрейм
frame.setSize(300, 200); // задаємо ширину і висоту фрейму
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // задаємо дії при закритті фрейму
frame.setVisible(true); // показати фрейм на екрані (зробити видимим)
}
}
Проте розміщувати увесь код в main() поганий стиль, оскільки, наприклад, коли доведеться додавати нові фрейми та інші елементи, код може стати доволі заплутаним. Крім того метод main статичний і потрібно враховувати деякі особливості робити у статичному контексті. Тому в main() часто намагаються залишити лише саме необхідне. І взагалі, якщо якийсь графічний елемент потребує значного коду, то бажано роботу з ним розмістити окремо. В нашому випадку усю роботу з фреймом можна доручити класу, який розширюватиме клас JFrame.
Наступний переписаний код робить теж саме, що і попередній. На перший погляд може здатися, що такий спосіб є доволі незручним, насправді ж у великих проектах - це виправдовується.
import javax.swing.*;
public class SimpleFrame
{
public static void main(String[] args)
{
MyFrame frame = new MyFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class MyFrame extends JFrame
{
public MyFrame()
{
setSize(FRAME_WIDTH, FRAME_HEIGHT);
}
public static final int FRAME_WIDTH = 350;
public static final int FRAME_HEIGHT = 200;
}
Дана програма складається з двох класів, хоча метод MyFrame() можна б було розмістити і в класі SimpleFrame. Проте, на думку ряду програмістів, краще відділяти клас який запускає програму на виконання від класу, в якому описується інтерфейс користувача. Одною з причин такого є більш краща читабельність коду програми.
Розглянемо детальніше нашу програму.
Перший рядок import javax.swing.*; робить доступними класи бібліотеки Swing. Дальше в методі main() ми задаємо розмір нашому фреймові викликаючи конструктор класу MyFrame. Метод setSize() встановлює розмір вікна 350x200 пікселів.
По замовчуванню фрейм буде 0х0 пікселів.
Рядок frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); — вказує програмі, що потрібно зробити, якщо користувач захоче закрити фрейм. В даному випадку програма просто завершить свою роботу. І насамкінець ми робимо наш фрейм видимим викликаючи метод setVisible().
Фрейм - це контейнер в який поміщають всі інші компоненти (меню, кнопки, прапорці та інші елементи графічного елементу). Сам клас JFrame, який реалізує фрейм складається з чотирьох областей (pane), що накладаються одна на одну: коренева область (root pane), область шару (layered pane), прозора область (glass pane) та область вмісту (content pane). Перші три застосовують для створення та обслуговування меню. Для роботи з графічними елементами застосовується область вмісту, в яку і додають компоненти. Додати компонент можна наступним чином:
Container contentPane = frame.getContentPane();
Component c=....;
contentPane.add (c)
// з версії JDK 1.5 реалізований метод JFrame.add()
// що переадресовує виклик методу області вмісту contentPane.add()
// і тепер можна просто писати: add (c)
Щоправда напряму у фреймі не прийнято вставляти компоненти. Для цього використовується спеціальний компонент-контейнер - панель (panel), що добавляється до фрейму. Після цього у панель можна додавати різні графічні компоненти.
Для початку спробуємо намалювати прямокутник. Щоб додати відповідну панель, в якій буде здійснюватись малювання, необхідно:
class MyPanel extends JPanel{
public void paintComponent(Graphics g){
.....// код, що здійснює малювання
}
}
import javax.swing.*;
import java.awt.*;
public class Pr_70 {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyFrame frame = new MyFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class MyFrame extends JFrame
{
public MyFrame()
{
setSize(FRAME_WIDTH, FRAME_HEIGHT);
PaintPanel panel=new PaintPanel();
add(panel);
}
public static final int FRAME_WIDTH = 350;
public static final int FRAME_HEIGHT = 200;
}
class PaintPanel extends JPanel
{
@Override // вказує, що даний метод заміщується (не обов'язково)
public void paintComponent(Graphics g)
{
super.paintComponent (g);
g.drawString("Малюємо прямокутник:", 10, 20);
g.drawRect(10, 40, 300, 100);
}
}
Результат виконання: