МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра САПР
Звіт про виконання лабораторної роботи №6
з курсу: “Об’єктно-орієнтоване програмування”
на тему: “Використання системи Swing в Java”
Львів 2008
МЕТА РОБОТИ
Метою роботи є придбання навиків програмування графічних додатків Java з використанням системи Swing.
КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ
Основні компоненти 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 здатні працювати тільки по моделі делегування подій.
Контейнери верхнього рівня і спеціалізовані контейнери
Так само, як і для AWT, для створення вікон графічних додатків використовується не клас JWindow, а клас JFrame (вікна, що створюються класом JWindow не містять найменування вікна і кнопок управління вікном). Додатки з графічним інтерфейсом використовує, принаймні, один фрейм. Аплети також можуть використовувати фрейми. Для створення вікон, які залежать від іншого вікна (наприклад, зникають, коли згортається вікно, в якому вони використовуються) застосовуються діалогові вікна класу JDialog. Аплети, що використовують компоненти Swing, повинні бути підкласами класу JApplet. Будь-яка програма, яка використовує компоненти Swing, містить, принаймні, один контейнер верхнього рівня. Цей контейнер є коренем ієрархії контейнерів, що містять всі компоненти Swing. Як правило, окремий графічний додаток має, принаймні, одну ієрархію контейнерів, в якій коренем є JFrame. Діалогове вікно або аплет також утворюють ієрархію контейнерів, коренем якої є JDialog або JApplet. Наприклад, якщо додаток містить одне головне вікно і два діалогові вікна, то вона містить три ієрархії контейнерів.
Коренева панель
Кожен контейнер верхнього рівня базується на проміжному, прихованому, контейнері, званому кореневою панеллю (root pane). Коренева панель визначена в класі JRootPane. Сама коренева панель звичайно не використовується, а використовуються її компоненти, які коренева панель (клас) надає фрейму (або іншому контейнеру верхнього рівня). Коренева панель містить наступні компоненти:
шарувата панель (layered pane);
панель вмісту (content pane);
рядок меню (menu bar) - необов'язковий компонент;
скляна панель (glass bar).
Єдиним обов'язковим контейнером верхнього рівня є панель вмісту.
Панель вмісту
Панель вмісту містить всі компоненти 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
Малювання прямокутників в графічному вікні. При натисненні кнопки миші фіксується лівий верхній кут прямокутника. При відпуску миші фіксується правий нижній кут прямокутника, і прямокутник промальовувався на екрані. Колір зафарбовування прямокутника задається за допомогою списку, що розкривається. Кожен пункт списку містить зображення квадратика відповідного кольору.
Аналіз роботи програми
Текст програми
MainWindow.java
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;
public class MainWindow extends JFrame {
private static final long serialVersionUID = 1L;
public int x0;
public int y0;
public int x;
public int y;
int xmin;
int ymin;
public boolean isPainting = false;
private JComboBox colorsBox;
private Color myColor;
private Dimension frameSize;
private Dimension screenSize;
private Container c;
MainWindow(String str) {
super(str);
c = getContentPane();
setSize(400, 400);
setLayout(new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBackground(Color.WHITE);
screenSize = Toolkit.getDefaultToolkit().getScreenSize();
frameSize = getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
colorsBox = new JComboBox(new String[] { "RED", "GREEN", "BLUE" });
colorsBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
if (colorsBox.getSelectedItem().equals("RED")) {
myColor = Color.RED;
}
if (colorsBox.getSelectedItem().equals("GREEN")) {
myColor = Color.GREEN;
}
if (colorsBox.getSelectedItem().equals("BLUE")) {
myColor = Color.BLUE;
}
}
}
});
addMouseListener(new MyMouseAdapter(this));
addMouseMotionListener(new MyMouseMotionAdapter(this));
add(colorsBox);
setVisible(true);
}
public void paint(Graphics g) {
g.setColor(myColor);
colorsBox.repaint();
g.fillRect(getMin(x, x0), getMin(y, y0), Math.abs(x0 - x), Math.abs(y0
- y));
colorsBox.repaint();
}
public int getMin(int x, int x0) {
if (x < x0)
return x;
else
return x0;
}
}
MyMouseAdapter.java
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class MyMouseAdapter extends MouseAdapter {
private MainWindow win;
public MyMouseAdapter(MainWindow myWin) {
win = myWin;
}
public void mousePressed(MouseEvent me) {
win.x0 = me.getX();
win.y0 = me.getY();
win.isPainting = true;
}
public void mouseReleased(MouseEvent me) {
win.x = me.getX();
win.y = me.getY();
win.isPainting = false;
win.repaint();
}
}
MyMouseMotionAdapter.java
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
public class MyMouseMotionAdapter extends MouseMotionAdapter {
private MainWindow win;
public MyMouseMotionAdapter(MainWindow myWin) {
win = myWin;
}
public void mouseDragged(MouseEvent me) {
if (win.isPainting) {
win.x = me.getX();
win.y = me.getY();
System.out.println("Mouse moved");
win.repaint();
}
}
}
Run.java
public class Run {
public static void main(String[] args)
{
MainWindow frame = new MainWindow("DrawLines");
}
}
Висновок
Під час виконання цієї лабораторної роботи я отримав навики програмування графічних додатків Java з використанням системи Swing.