알버트의 개발하는 블로그

자바 제26강 : 자바 Panel 클래스 상속받아서 paint() 메소드로 그래픽 구현하기 본문

프로그래밍 언어/Java

자바 제26강 : 자바 Panel 클래스 상속받아서 paint() 메소드로 그래픽 구현하기

알버트 2021. 9. 13. 10:29

 

이번 시간에는 자바의 Panel 클래스에서 제공하는 paint() 메소드를 이용하여 윈도우창에 그래픽을 구현하는 것을 해보도록 하겠습니다. paint() 메소드는 윈도우창에 그래픽을 구현시켜 주는 메소드로써 추상메소드이기 때문에 반드시 override를 해주어야 하는 성질을 갖고 있습니다.

따라서 윈도우에 그래픽을 표시하려면 Panel 또는 JPanel 클래스를 상속받은 뒤에 paint() 메소드를 override 시켜서 그래픽을 구현하고 클래스 객체를 윈도우에 추가해주면 됩니다. 바로 간단한 예제를 통해서 윈도우창에 그래픽을 구현해보도록 하겠습니다.

 

 


 

윈도우 그래픽 구현 예제

 

package kr.koreait.graphicTest;

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

//			Panel 클래스를 상속받고 Runnable 인터페이스 구현받음
public class GraphicTest extends Panel implements Runnable {
	int xpos = 0;	        // 팩맨의 이동을 담당하는 x좌표
	int position = 0;	// 팩맨이 벽에 부딛혔을때 입방향을 반대로 바꿔주는 변수
	int angle = 0;		// 팩맨 입의 시작 각도
	
	public static void main(String[] args) {
		Frame window = new Frame("GraphicTest");
		window.setBounds(700, 50, 500, 600);
		window.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
//		paint() 메소드를 override 해서 그래픽을 구현한 객체를 만든다.
		GraphicTest graphic = new GraphicTest();
		
//		그래픽을 구현한 객체를 윈도우에 추가한다.
		window.add(graphic);
		
		window.setVisible(true);
//		스레드를 만들고 스레드를 실행시켜 준다.
		Thread thread = new Thread(graphic);
		thread.start();	
	}	
	@Override
	public void paint(Graphics g) {
		
//	그래픽의 컬러를 오렌지로 설정한다.
		g.setColor(Color.ORANGE);
//	g.fillArc(x좌표, y좌표, width(가로), height(세로), startAngle, arcAngle);
		g.fillArc(xpos, 100, 100, 100, position + angle, 360 - angle * 2);
//	startAngle : 원의 호가 시작 각도
//	arcAngle : 호가 얼만큼 그려지는지의 각도
	}

	@Override
	public void run() {
		int xsw = 1, asw = 1;
		while(true) {
			xpos += xsw;    //x position이 실시간으로 바뀜
			if(xpos > 390 || xpos < 0) {
				xsw *= -1;   //x position의 방향을 바꿔주는 처리
//	윈도우창의 우측이나 좌측에 팩맨이 부딪히면 방향을 바꿔줌
				position = (position + 180) % 360;
			}
			angle += asw; 	//팩맨 입의 각도 변화
			if(angle > 30 || angle < 0) {
				asw *= -1;	
			}
//      스레드슬립으로 0.01초마다 타임슬립
	try{Thread.sleep(10);}catch(InterruptedException e){e.printStackTrace();}
//      화면에 표시할 그래픽의 내용이 변경되면 repaint() 메소드를 실행해서 다시 그린다.
		repaint();
		}	
	}
}

 

코드는 이와 같습니다. paint() 메소드를 오버라이드하여서 오렌지색으로 설정하고 원의 호를 그리는 메소드인 fillArc를 통해서 오렌지색 팩맨을 만들어주었습니다. 그리고, Runnable인터페이스의 run() 메소드를 오버라이드해서 팩맨의 입이 계속 움직이고 윈도우창 좌우로 왔다갔다 거릴 수 있도록 코딩해주었습니다. 바로 실행해보겠습니다.

 

 

 

 

 

이렇게 팩맨이 좌우로 왔다갔다거리면서 입을 계속 움직이는것을 볼 수 있습니다. 이처럼 Panel클래스를 상속받으면 paint() 메소드를 오버라이드해서 그래픽을 구현할 수 있습니다. 이것은 윈도우 관련 프로그래밍에서 그래픽을 구현하기 위해서 아주 기초적인 작업이라고 할 수 있겠습니다. 위에 써놓은 메소드 말고도 그래픽 관련해서 참 많은 메소드가 있습니다. 충분한 연습을 통해서 익숙해지면 프로그래밍에 큰 도움이 될 것입니다. 읽어주셔서 감사합니다.