JAVA/Swing

Canvas와 Graphics.Swing

john_ 2023. 2. 20. 16:31
728x90

Canvas 와 Graphics

  • Swing에서는 Canvas 클래스를 이용해 도화지를, Graphics 클래스를 이용해 붓을 구현할수 있습니다.
  • Canvas는 최초 드로잉 준비가 되면 paint() 메소드를 호출해서 Graphics로 드로잉을 합니다.
  • 그리고 다음과 같은경우 paint() 메소드를 다시 호출하여 Graphics로 재 드로잉을 합니다.
    1. 도화지를 축소했다가 다시 확대 했을때
    2. 도화지의 크기가 변경 되었을때
    3. 도화지가 숨겨졌다가 다시 나타났을때

다음의 예제로 윈도우창이 축소되거나 확대될때

Canvaspaint() 메소드가 다시 호출되어 글자를 다시 그리는것을 알수 있습니다.

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() 메소드를 호출할수 있습니다.
  • Canvasrepaint() 메소드가 호출되면 이벤트 디스패칭 스레드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