- •Лекция 5. Графический пользовательский интерфейс
- •5.1. Библиотека Swing
- •5.1.1. Библиотеки для создания графического интерфейса
- •5.1.2. Анонимные вложенные классы
- •5.1.3. Интерфейс Runnable
- •5.1.4. Использование библиотеки Swing
- •5.2. Окна верхнего уровня
- •5.2.1. Класс jFrame
- •5.3. Рисование в окне
- •5.3.1. Особенности рисования в классах ComponentиJComponent
- •5.3.2. Вычисление области рисования
- •5.3.3. Класс Graphics
- •5.3.4. Класс Color.
- •5.3.5. Класс Font.
- •5.4. Скроллинг.
- •5.4.1. Класс jScrollPane.
5.3. Рисование в окне
5.3.1. Особенности рисования в классах ComponentиJComponent
В классе JComponentопределён методvoidpaint(Graphicsg), отвечающий за прорисовку компонента. Этот метод вызывается средой выполнения, в случае если какую-то область компонента необходимо перерисовать. Методpaintне следует вызывать напрямую. Для того, чтобы принудительно перерисовать компонент предназначен методvoidrepaint(), сигнализирующий среде выполнения о том, что требуется вызвать методpaint. В отличие от классаComponentбиблиотекиAWT, в классеJComponentметодpaintне прорисовывает компонент, а последовательно вызывает методыpaintComponent,paintBorder,paintChildren, которые прорисовывают соответственно сам компонент, рамку компонента, дочерние компоненты. Так как классJFrameсодержит в своей иерархии классComponent, его прорисовка должна происходить в методеpaint. Другие же классыSwing, унаследованные отJComponentдолжны выполнять прорисовку в методеpaintComponent.

Рис. Процедура перерисовки объекта Component.

Рис. Различия в функции прорисовки классов ComponentиJComponent.
Пример подхода к рисованию класса Component:
import java.awt.*;
import javax.swing.*;
public class ForegroundWindow extends JFrame {
public ForegroundWindow() {
super("Пример окна верхнего уровня");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 200);
setVisible(true);
}
public void paint(Graphics g) {
// прорисовка компонента
super.paint(g);
g.drawRect(50, 50, 200, 100);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new ForegroundWindow().setVisible(true);
}
});
}
}
Пример подхода к рисованию класса JComponent:
import java.awt.*;
import javax.swing.*;
public class ForegroundWindow extends JFrame {
public class DrawingPanel extends JPanel {
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(50, 50, 200, 100);
}
}
public ForegroundWindow() {
super("Пример окна верхнего уровня");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 200);
add(new DrawingPanel());
setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new ForegroundWindow().setVisible(true);
}
});
}
}
5.3.2. Вычисление области рисования
Компонент JComponentможет содержать рамку, поэтому при рисовании необходимо вычислить размеры отступов, которые занимает эта рамка. Эти размеры могут быть получены с помощью функцииgetInsets(), которая возвращает объект классаInsets.
Класс Insetsсодержит в себе поляleft,right,top,bottom, которые определяют отступы слева, справа, сверху и снизу.
Пример:
import java.awt.*;
import javax.swing.*;
public class ForegroundWindow extends JFrame {
public class DrawingPanel extends JPanel {
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Insets is = getInsets();
g.drawLine(is.left, is.top, getWidth() - is.right,
getHeight() - is.bottom);
g.drawLine(is.left, getHeight() - is.bottom,
getWidth() - is.right, is.top);
}
}
public ForegroundWindow() {
super("Пример окна верхнего уровня");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 200);
DrawingPanel dp = new DrawingPanel();
dp.setBorder(BorderFactory.createTitledBorder(
"Заголовок рамки"));
add(dp);
setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new ForegroundWindow().setVisible(true);
}
});
}
}

