728x90
Canvas 와 Graphics
- Swing에서는 Canvas 클래스를 이용해 도화지를, Graphics 클래스를 이용해 붓을 구현할수 있습니다.
- Canvas는 최초 드로잉 준비가 되면 paint() 메소드를 호출해서 Graphics로 드로잉을 합니다.
- 그리고 다음과 같은경우 paint() 메소드를 다시 호출하여 Graphics로 재 드로잉을 합니다.
- 도화지를 축소했다가 다시 확대 했을때
- 도화지의 크기가 변경 되었을때
- 도화지가 숨겨졌다가 다시 나타났을때
다음의 예제로 윈도우창이 축소되거나 확대될때
Canvas의 paint() 메소드가 다시 호출되어 글자를 다시 그리는것을 알수 있습니다.
package java0220;
import java.awt.*;
import javax.swing.*;
public class CanvasPaintExample extends JFrame {
public CanvasPaintExample() {
this.setTitle("paint() 메소드는 언제 호출 될까요?");
// 사용자 정의 Canvas 객체를 중앙에 배치
this.getContentPane().add(new MyCanvas(), BorderLayout.CENTER);
setSize(300, 200);
}
// 사용자 정의 Canvas 클래스 선언
public class MyCanvas extends Canvas{
public void paint(Graphics g) {
g.drawString("윈도우 창을 줄이거나 늘려보세요", 50,80);
System.out.println("paint() 메소드 실행");
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
CanvasPaintExample jFrame = new CanvasPaintExample();
jFrame.setVisible(true);
}
});
}
}

다시그리기(redrawing)
- Canvas 에 드로잉 하는 작업은 이벤트 디스패칭 스레드가 전담합니다.
- 이벤트 디스패칭 스레드는 Canvas의 내용이 갱신될 필요가 있을때 paint() 메소드를 다시 호출해서 재 드로잉을 합니다.
- 하지만 개발자는 paint() 메소드를 직접 호출할수 없고, repaint() 메소드를 호출할수 있습니다.
- Canvas의 repaint() 메소드가 호출되면 이벤트 디스패칭 스레드는 update() 메소드를 호출하고 다시 paint() 메소드를 호출해서 재 드로잉을 합니다.
- update() 메소드의 기본 동작은 paint() 메소드를 호출하기 전에 이전 화면 내용을 지우는 역할을 합니다.

- 이전 내용을 유지하면서 재 드로잉 하려면 update() 메소드를 재정의해서 이전 내용을 지우는 코드를 작성하지 않고, paint(g) 메소드만 호출하면 됩니다.

다음 예제는 Canvas 위에서 마우스를 누른 상태로 드래그 하면 이전 경로에서 현재경로까지 * 를 유지하면서 드로잉 합니다.
만양 Canvas의 Update() 메소드를 재정의 하지 않으면 이전 화면을 지우는 update()의 기본 기능때문에 이전 경로의 *는 모두 지워집니다.
package java0220;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RepaintExample extends JFrame {
public RepaintExample() {
this.setTitle("재 드로잉");
// Canvas를 중앙에 배치
this.getContentPane().add(new MyCanvas(), BorderLayout.CENTER);
setSize(500, 400);
}
//MyCanvas 클래스 정의
public class MyCanvas extends Canvas implements MouseMotionListener {
private int x; // 마우스 x 좌표
private int y; // 마우스 y 좌표
public MyCanvas() {
//MouseMotionListener 추가
addMouseMotionListener(this);
}
//Canvas의 update() 재정의
@Override
public void update(Graphics g) {
paint(g);
}
@Override
public void paint(Graphics g) {
g.drawString("*", x, y);
}
//MouseMotionListener의 mouseDragged() 재정의
// 마우스 버튼을 누르고 움직일 때 호출
@Override
public void mouseDragged(MouseEvent e) {
x = e.getX();
y = e.getY();
//Canvas의 repaint() 호출
repaint();
}
//MouseMotionListener의 mouseMoved() 재정의
//마우스 버튼을 누르지 않고 움직일 때 호출
@Override
public void mouseMoved(MouseEvent e) {
System.out.println("aaa");
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
RepaintExample jFrame = new RepaintExample();
jFrame.setVisible(true);
}
});
}
}

728x90
'JAVA > Swing' 카테고리의 다른 글
| 이미지 그리기.Swing (0) | 2023.02.20 |
|---|---|
| 안티 알리아싱(Anti-aliasing).Swing (0) | 2023.02.20 |
| Color와 Font.Swing (0) | 2023.02.20 |
| JDBC를 이용해 INSERT 실행하기.Java (0) | 2023.02.16 |
| Swing 시작.java (0) | 2023.02.16 |