본문 바로가기

BackEnd/Java

[java]이것이 자바다 부록 Java UI 13 (Swing을 이용한 2D 그래픽스)

728x90
반응형

1. 2D 그래픽스

   ▷ 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; public class CanvasPaintExample extends JFrame { ​​​​// 메인 윈도우 설정 ​​​​public CanvasPaintExample() { ​​​​​​​​setTitle("print() 메소드는 언제 호출될까요?"); ​​​​​​​​ ​​​​​​​​// 사용자 정의 Canvas 객체를 중앙에 배치 ​​​​​​​​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("print() 메소드 실행"); ​​​​​​​​} ​​​​} ​​​​ ​​​​public static void main(String[] args) { ​​​​​​​​SwingUtilities.invokeLater(new Runnable() { ​​​​​​​​​​​​public void run() { ​​​​​​​​​​​​​​​​CanvasPaintExample jFrame = new CanvasPaintExample(); ​​​​​​​​​​​​​​​​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; public class RepaintExample extends JFrame { ​​​​// 메인 윈도우 설정 ​​​​public RepaintExample() { ​​​​​​​​setTitle("재 드로잉"); ​​​​​​​​ ​​​​​​​​// Canvas를 중앙에 배치 ​​​​​​​​getContentPane().add(new MyCanvas(), BorderLayout.CENTER); ​​​​​​​​ ​​​​​​​​setSize(500, 400); ​​​​} ​​​​ ​​​​// Canvas 클래스 선언 ​​​​public class MyCanvas extends Canvas implements MouseMotionListener { ​​​​​​​​private int x; ​​​​​​​​private int y; ​​​​​​​​ ​​​​​​​​public MyCanvas() { ​​​​​​​​​​​​ ​​​​​​​​​​​​// MouseMotionListener 추가 ​​​​​​​​​​​​addMouseMotionListener(this); ​​​​​​​​} ​​​​​​​​ ​​​​​​​​// Canvas의 update() 재정의 ​​​​​​​​@Override ​​​​​​​​public void update(Graphics g) { ​​​​​​​​​​​​paint(g); ​​​​​​​​} ​​​​​​​​ ​​​​​​​​// Canvas의 paint() 재정의 ​​​​​​​​@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); ​​​​​​​​​​​​} ​​​​​​​​}); ​​​​} }

 

 

Canvas와 Graphics를 이용해 창에 그림을 그리거나 형상 변경시 콘솔창에 값들을 출력할 수 있도록 만들었습니다.

 

움직임에 따라서 값들을 출력하는 것들을 어디에 이용할 수 있을지 고민해봐야겠어요~

 

더 많은 기능들에 대해서 배워볼게요~!!

 

많은 분들의 피드백은 언제나 환영합니다!  많은 댓글 부탁드려요~~

 

 

728x90
반응형