본문 바로가기
Programming/Java프로그래밍및실습

[자프실] 11. 그래픽

by Lizardee 2024. 1. 15.
11.1 스윙 컴포넌트 그리기
컴포넌트는 자신의 모양을 스스로 그린다

 

paintComponent()

: 스윙 컴포넌트가 자신의 모양을 그리는 메소드

public void paintComponent(Graphics g)

 

paintComponent()의 오버라이딩

: 개발자가 JComponent를 상속받아 새로운 컴포넌트를 설계하든지 아니면 기존의 스윙 컴포넌트 모양에 변화를 주고자 할 때

paintComponent()의 오버라이딩

 

JPanel에 그리기
  • JPanel: 아무 모양도 없는 텅 빈 컴포넌트이면서 컨테이너

 

/*
 * JPanel을 상속받은 패널에 도형 그리기
 */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class paintJPanelEx extends JFrame {
	public paintJPanelEx() {
		setTitle("JPanel의 paintComponent() 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(new MyPanel());  // MyPanel 패널을 컨텐트팬으로 사용
		
		setSize(250,200);
		setVisible(true);
	}
	
	// JPanel을 상속받는 새 패널 구현
	class MyPanel extends JPanel{
		public void paintComponent(Graphics g) {
			super.paintComponent(g);  // JPanel의 paintComponent() 호출
			g.setColor(Color.BLUE); // 파란색 선택
			g.drawRect(10, 10, 50,50);  // (10,10) 위치에 50x50 크기의 사각형
			g.drawRect(50, 50, 50, 50); 
			
			g.setColor(Color.MAGENTA);
			g.drawRect(90, 90, 50, 50);
		}
	}
	
	public static void main(String[] args) {
		new paintJPanelEx();
	}
}

 


11.2 Graphics
그래픽 기반 GUI 프로그래밍

▶ 그래픽: 개발자가 스윙 컴포넌트에 의존하지 않고 선, 원, 이미지 등을 이용하여 직접 화면을 구성하는 기능

 

Graphics

Graphics

 

문자열 그리기

문자열 그리기

 

색상과 폰트, Color와 Font

색상과 폰트, Color와 Font

 

Graphics에서 색상과 폰트 활용

Graphics에서 색상과 폰트 활용

/*
 * 예제 11-2
 */
import javax.swing.*;
import java.awt.*;

public class GraphicsColorFontEx extends JFrame {
	public GraphicsColorFontEx() {
		setTitle("문자열, Color, Font 사용 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(new MyPanel());  // MyPanel
		
		setSize(300,300);
		setVisible(true);
	}
	
	// JPanel을 상속받아 새 패널 구현
	class MyPanel extends JPanel{
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.setColor(Color.BLUE);
			g.drawString("자바가 정말 재밋다~~", 30, 30);
			
			g.setColor(Color.RED);
			g.setFont(new Font("Arial", Font.ITALIC, 30));
			g.drawString("How much?", 30,70);
			
			g.setColor(new Color(0x00ff00ff));  // r = ff, g = 00, b = ff (보라색)
			for(int i=1; i<=4; i++) {
				g.setFont(new Font("Jokerman", Font.ITALIC, i*10));
				g.drawString("This much!", 30, 60 + i*40);
			}
		}
	}
	public static void main(String[] args) {
		new GraphicsColorFontEx();
	}
}

 


11.3 도형 그리기와 칠하기
도형 그리기

도형 그리기

/*
 * 예제 11-3: Graphics의 drawLine()을 이용하여 선 그리기
 */

import javax.swing.*;
import java.awt.*;

public class GraphicsDrawLineEx extends JFrame {
	public GraphicsDrawLineEx() {
		setTitle("drawLine 사용 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(new MyPanel());
		
		setSize(200,150);
		setVisible(true);
	}
	
	// MyPanel
	class MyPanel extends JPanel{
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.setColor(Color.RED);
			g.drawLine(20, 20, 100, 100);  // (20,20)~(100,100)
		}
	}
	
	public static void main(String[] args) {
		new GraphicsDrawLineEx(); 
	}
}

 

원호와 폐다각형 그리기

원호와 폐다각형 그리기

 

도형 칠하기

/*
 * 예제 11-4: 도형 칠하기
 */
import javax.swing.*;
import java.awt.*;

public class GraphicsFillEx extends JFrame {
	public GraphicsFillEx() {
		setTitle("fillxxx 사용 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(new MyPanel());  // MyPanel
		
		setSize(100,350);
		setVisible(true);
	}
	
	// MyPanel
	class MyPanel extends JPanel{
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			
			g.setColor(Color.RED);
			g.fillRect(10, 10, 50, 50);
			
			g.setColor(Color.BLUE);
			g.fillOval(10,70,50,50);
			
			g.setColor(Color.GREEN);
			g.fillRoundRect(10, 130, 50, 50, 20, 20);
			
			g.setColor(Color.MAGENTA);
			g.fillArc(10, 190, 50, 50, 0, 270);
			
			g.setColor(Color.ORANGE);
			int [] x = {30,10,30,60};
			int [] y = {250,275,300,275};
			g.fillPolygon(x,y,4);  // 다각형 칠하기
		}
	}
	
	public static void main(String[] args) {
		new GraphicsFillEx();
	}
}

 


11.4 이미지 그리기
이미지 그리는 2가지 방법

이미지 그리는 2가지 방법

 

Graphics의 drawImage() 메소드

Graphics의 drawImage() 메소드

 

Graphics의 이미지 그리기

Graphics의 이미지 그리기

/*
 * 예제11-5: 원본 크기로 이미지 그리기
 */

import javax.swing.*;
import java.awt.*;

public class GraphicsDrawImageEx1 extends JFrame {
	public GraphicsDrawImageEx1() {
		setTitle("원본 크기로 원하는 위치에 이미지 그리기");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(new MyPanel());  // MyPanel
		
		setSize(300,400);
		setVisible(true);
	}
	
	class MyPanel extends JPanel {
		private ImageIcon icon = new ImageIcon("images/image0.jpg");  // 이미지 로딩
		private Image img = icon.getImage();  // 이미지 객체
		
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			
			// 이미지를 패널의 (20,20)에 원래의 크기로 그린다.
			g.drawImage(img, 20, 20, this);
		}
	}
	
	public static void main(String[] args) {
		new GraphicsDrawImageEx1();
	}
}

 

/*
 * 예제 11-6: JPanel 크기에 맞추어 이미지 그리기
 */
import javax.swing.*;
import java.awt.*;

public class GraphicsDrawImageEx2 extends JFrame {
	public GraphicsDrawImageEx2() {
		setTitle("패널의 크기에 맞추어 이미지 그리기");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(new MyPanel());
		
		setSize(200,300);
		setVisible(true);
	}
	
	class MyPanel extends JPanel{
		private ImageIcon icon = new ImageIcon("imgaes/image0.jpg");  // 이미지 로딩
		private Image img = icon.getImage();  // 이미지 객체
		
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			
			// 이미지를 패널 크기로 조절하여 그린다.
			g.drawImage(img, 0, 0, getWidth(),  getHeight(),  this);
		}
	}
	
	public static void main(String[] args) {
		new GraphicsDrawImageEx2();
	}
}

 


11.5 repaint()와 그래픽 응용
repaint()

: 개발자는 프로그램에서 컴포넌트의 색, 모양, 크기, 텍스트 등을 변경한 후 repaint()를 호출하여, 자바 플랫폼이 컴포넌트의 paintComponent()를 호출하도록 해야 한다.

 

repaint()와 마우스를 이용한 응용

/*
 * 예제 11-7: repaint()와 마우스를 이용한 타원 그리기
 */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class GraphicsDrawOvalMouseEx extends JFrame {
	public GraphicsDrawOvalMouseEx() {
		setTitle("마우스 드래깅으로 타원 그리기 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(new MyPanel());
		
		setSize(300,300);
		setVisible(true);
	}
	
	// 타원을 그릴 패널 작성. 이 패널에 마우스 리스너 구현
	class MyPanel extends JPanel{
		private Point start=null, end=null;  // 마우스의 시작점과 끝점
		public MyPanel() {
			MyMouseListener listener = new MyMouseListener();  // 리스너 생성
			
			// listener를 아래 두 리스너로 공통으로 등록해야 한다.
			addMouseListener(listener);  // Mouse 리스너 등록
			addMouseMotionListener(listener);  // MouseMotion 리스너 등록
		}
		
		class MyMouseListener extends MouseAdapter{  // 마우스 리스너
			public void mousePressed(MouseEvent e) {
				start=e.getPoint();  // 마우스 포인터(시작점)를 start 객체에 저장
			}
			public void mouseDragged(MouseEvent e) {
				end = e.getPoint();  // 마우스 포인터(끝점)를 end 객체에 저장
				repaint();
			}
		}
		
		// 패널에 타원 그리기
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			if(start == null)  // 타원이 만들어지지 않았음
				return;
			
			g.setColor(Color.BLUE);
			int x = Math.min(start.x,  end.x);
			int y = Math.min(start.y, end.y);
			int width = Math.abs(start.x - end.x);
			int height = Math.abs(start.y - end.y);
			g.drawOval(x, y, width, height);  // 타원 그리기
		}
	}
	
	public static void main(String[] args) {
		new GraphicsDrawOvalMouseEx();
	}
}

 

/*
 * 예제 11-8: repaint()와 마우스를 이용한 여러 개의 선 그리기
 */

import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.awt.event.*;

public class GraphicsDrawLineMouseEx extends JFrame {
	public GraphicsDrawLineMouseEx() {
		setTitle("마우스로 여러 개의 선 그리기 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(new MyPanel());
		
		setSize(300,300);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new GraphicsDrawLineMouseEx();
	}
	
	class MyPanel extends JPanel{
		private Vector<Point> vStart = new Vector<Point>();
		private Vector<Point> vEnd = new Vector<Point>();
		
		public MyPanel() {
			
			addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					Point startP = e.getPoint();
					vStart.add(startP);
				}
				public void mouseReleased(MouseEvent e) {
					Point endP = e.getPoint();
					vEnd.add(endP);
					
					repaint();
				}
			});
		}
		
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.setColor(Color.BLUE);
			
			for(int i=0; i<vStart.size(); i++) {
				Point s = vStart.elementAt(i);
				Point e = vEnd.elementAt(i);
				
				g.drawLine((int)s.getX(), (int)s.getY(), (int)e.getX(), (int)e.getY());
			}
		}
	}
}