Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Java / Лекции / lection5.docx
Скачиваний:
79
Добавлен:
15.03.2015
Размер:
230.33 Кб
Скачать

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);

}

});

}

}

Соседние файлы в папке Лекции