▷ UI 프로그램에서 윈도우 창이나 버튼, 이미지 등은 모두 화면에서 드로잉된 2D 그래픽
▷ Swing은 개발자가 코드로 2D 그래픽을 드로잉하도록 Java2D API를 제공
(1) Canvas와 Graphics
▷ Canvas : 도화지, Graphics : 붓
▷ Canvas는 최초 드로잉 준비가 되면 paint() 메소드를 호출해서 Graphics로 드로잉 함
▶paint() 메소드를 다시 호출하여 Graphics로 재 드로잉 함
① 도화지가 축소되었다가 다시 확대했을 때 ② 도화지의 크기가 변경되었을 때 ③ 도화지가 숨겨졌다가 다시 나타났을 때
◎ 윈도우 창 사이즈 변경시 콘솔 출력 예제
import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Graphics;import javax.swing.JFrame;import javax.swing.SwingUtilities;publicclassCanvasPaintExampleextendsJFrame{// 메인 윈도우 설정publicCanvasPaintExample(){setTitle("print() 메소드는 언제 호출될까요?");// 사용자 정의 Canvas 객체를 중앙에 배치getContentPane().add(newMyCanvas(), BorderLayout.CENTER);setSize(300, 200);}// 사용자 정의 Canvas 클래스 선언publicclassMyCanvasextendsCanvas{publicvoidpaint(Graphics g){g.drawString("윈도우 창을 줄이거나 늘려보세요", 50, 80);System.out.println("print() 메소드 실행");}}publicstaticvoidmain(String[] args){SwingUtilities.invokeLater(newRunnable(){publicvoidrun(){CanvasPaintExamplejFrame=newCanvasPaintExample();jFrame.setVisible(true);}});}}
(2) 다시 그리기
▷ Canvas에 드로잉하는 작업은 이벤트 디스패칭 스레드가 전담
▷이벤트 디스패칭 스레드는 Canvas의 내용이 갱신될 필요가 있을 때 paint() 메소드를 다시 호출해서 재 드로잉 함
▷ 개발자는 paint() 메소드를 직접 호출할 수 없고, 대신 repaint() 메소드를 호출할 수 있음.
▷ repaint() 메소드가 호출되면 스레드는 update() 메소드를 호출하고 다시 paint() 메소드를 호출해서 재 드로잉을 함 ▷update() 메소드의 기본 동작은 paint() 메소드를 호출하기 전에 이전 화면 내용을 지우는 역할
만약 이전 내용을 유지하면서 재 드로잉을 하려면 update() 메소드를 재정의해서 이전 내용을 지우는 코드를 작성하지 않고 paint(g) 메소드만 호출
◎ Canvas 위에서 마우스를 누른 상태로 드래그하는 예제
import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Graphics;import java.awt.event.MouseEvent;import java.awt.event.MouseMotionListener;import javax.swing.JFrame;import javax.swing.SwingUtilities;publicclassRepaintExampleextendsJFrame{// 메인 윈도우 설정publicRepaintExample(){setTitle("재 드로잉");// Canvas를 중앙에 배치getContentPane().add(newMyCanvas(), BorderLayout.CENTER);setSize(500, 400);}// Canvas 클래스 선언publicclassMyCanvasextendsCanvasimplementsMouseMotionListener{privateint x;privateint y;publicMyCanvas(){// MouseMotionListener 추가addMouseMotionListener(this);}// Canvas의 update() 재정의@Overridepublicvoidupdate(Graphics g){paint(g);}// Canvas의 paint() 재정의@Overridepublicvoidpaint(Graphics g){g.drawString("*", x, y);}//MouseMotionListener의 mouseDragged() 재정의//마우스 버튼을 누르고 움직일 때 호출@OverridepublicvoidmouseDragged(MouseEvent e){x = e.getX();y = e.getY();// Canvas의 repaint() 호출repaint();}//MouseMotionListener의 mouseMoved() 재정의//마우스 버튼을 누르지 않고 움직일 때 호출@OverridepublicvoidmouseMoved(MouseEvent e){System.out.println("aaa");}}publicstaticvoidmain(String[] args){SwingUtilities.invokeLater(newRunnable(){publicvoidrun(){RepaintExamplejFrame=newRepaintExample();jFrame.setVisible(true);}});}}
Canvas와 Graphics를 이용해 창에 그림을 그리거나 형상 변경시 콘솔창에 값들을 출력할 수 있도록 만들었습니다.