본문 바로가기
코딩수업/AWS 클라우드환경 네이티브

8/22 자바(Java) GUI 활용 - JPanel 활용, 계산기, 오목 게임

by 인생즐겜러 2022. 8. 22.
728x90
반응형

AWS 클라우드환경 네이티브 수업 66일차

 

 

 

진행

1. Java GUI 활용

 

 

 

 

 

요약

1. Java GUI 활용

(계산기 만들기, JPanel 활용 - 사각형 그리기, 문자열 활용, 선, 원, 사각형, 둥근 사각형, 부채꼴, 다각형 그리기, 도형들 색깔 채워 그리기, 드래그로 원 그리기, 오목 게임 만들기 )

 

 

 

 

 


 

 

 

 

 

Java GUI 활용

 

 

 

25. 계산기 만들기 (직접한 건 아니고 예시 샘플을 받음)

 

 

 

package Swing.frame;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//-----------------------------------------------------------------------------------------------------------
// public class Calculator extends JFrame implements ActionListener
//-----------------------------------------------------------------------------------------------------------
public class Frame extends JFrame implements ActionListener {
	
	final	int	MAX_INPUT_LENGTH	= 20;	// 입력할 수 있는 최대 자리 수
	final	int	INPUT_MODE			= 0;	// 입력 상태
	final	int	RESULT_MODE			= 1;	// 출력 상태
	final	int	ERROR_MODE			= 2;	// 에러 상태
	
	int		displayMode;
	
	// 계산기가 처음 시작되거나, 어떤 연산이 끝난 후에 값을 true로 한다.
	// 이때 숫자버튼을 누르면 출력창에 연산 전의 값은 보이지 않게 하고
	// 새로 계산할 숫자를 보여주기 위해서 출력창을 먼저 지운 후에 새로운 숫자를 보여준다.
	// 새로운 숫자를 입력하면 clearOnNextDigit의 값을 false로 만들어야
	// 다음 연산전까지 입력한 숫자를 지우지 않아야 연이어 입력한 숫자가 보여질 수 있다.
	boolean	clearOnNextDigit;
	
	double	lastNumber;	// 연산 전에 저장된 값
	
	// 지금 누른 연산자 바로 전의 연산자를 저장하는 변수
	// 12 + 3 인 상태에서 - 를 누르면 화면에 15를 출력한다.
	// 12 인 상태에서 + 를 누르면 "0"을 가져가 processOperator(String op)를 처리한다.
	// ==> + 를 누른 상태이지만 연산할 값이 하나 밖에 없는 상태이기에 +연산을 할 상태가 아니므로
	//       lastOperator는 "0"이다.
	// 숫자 3을 더 입력한 상태에서 연산자(-)를 누르면 그 전에 입력한,
	// 12 + 3을 처리하기 위해 lastOperator의 값인 +를 가지고 작업을 처리한다.
	String	lastOperator;
	
	private	JLabel	jlbOutput;
	private	JButton	jbtnButtons[];
	private	JPanel	jplMaster, jplBackSpace, jplControl;
	
	Font	f12		= new Font("Times New Roman", 0, 22);
	
	//-----------------------------------------------------------------------------------------------------------
	// 생성자
	//-----------------------------------------------------------------------------------------------------------
	public Frame()
	{
		setBackground(Color.GRAY);	// 계산기의 배경색
		
		jplMaster	= new JPanel();
		
		// 출력 창 디자인
		jlbOutput	= new JLabel("0");	// 출력 창 생성
		jlbOutput.setHorizontalTextPosition(JLabel.RIGHT);
		jlbOutput.setBackground(Color.YELLOW);
		jlbOutput.setMinimumSize(new Dimension(100,  40));
		jlbOutput.setPreferredSize(new Dimension(100, 40));
		jlbOutput.setMaximumSize(new Dimension(200, 140));
		jlbOutput.setFont(new Font("Serif", Font.PLAIN, 30));
		jlbOutput.setOpaque(true);	// setOpaque(false) 투명하게
		
		// 가장 윗쪽에 출력 창을 배치한다.
		getContentPane().add(jlbOutput, BorderLayout.NORTH);
		
		// 23개의 모든 버튼을 가리키는 참조 변수
		jbtnButtons	= new JButton[23];
		
		// 버튼들이 올라가 Panel을 생성한다.
		JPanel jplButtons	= new JPanel();
		
		// 숫자 버튼을 만든다.
		for(int i = 0; i <= 9; i++) {
			jbtnButtons[i] = new JButton(String.valueOf(i));
		}
		
		// 각종 기능 버튼을 만든다.
		jbtnButtons[10]	= new JButton("+/-");
		jbtnButtons[11]	= new JButton(".");
		jbtnButtons[12]	= new JButton("=");
		jbtnButtons[13]	= new JButton("/");
		jbtnButtons[14]	= new JButton("*");
		jbtnButtons[15]	= new JButton("-");
		jbtnButtons[16]	= new JButton("+");
		jbtnButtons[17]	= new JButton("sqrt");
		jbtnButtons[18]	= new JButton("1/x");
		jbtnButtons[19]	= new JButton("%");
		
		// 백스페이스 버튼은 별도 Panel에 추가한다.
		jplBackSpace	= new JPanel();
		jplBackSpace.setLayout(new GridLayout(1, 1, 2, 2));
		
		jbtnButtons[20]	= new JButton("BackSpace");
		jplBackSpace.add(jbtnButtons[20]);
		
		// CE, C 버튼은 별도의 Panel에 추가한다.
		jplControl		= new JPanel();
		jplControl.setLayout(new GridLayout(1, 2, 2, 2));
		
		jbtnButtons[21]	= new JButton(" CE ");
		jbtnButtons[22]	= new JButton("C");
		
		jplControl.add(jbtnButtons[21]);
		jplControl.add(jbtnButtons[22]);
		
		// 숫자 버튼들의 글자색은 파란색으로, 기능 버튼들의 글자색은 magenta로 설정한다.
		for(int i = 0; i < jbtnButtons.length; i++) {
			jbtnButtons[i].setFont(f12);
			if(i < 10) {	// 숫자 버튼
				jbtnButtons[i].setForeground(Color.BLUE);
			} else {	// 기능 버튼
				jbtnButtons[i].setForeground(Color.MAGENTA);
			}
		}
		
		// 4 x 5 Grid 형태로 설정한다.
		jplButtons.setLayout(new GridLayout(4, 5, 2, 2)); // (int rows, int cols, int hgap, int vgap)
		
		// 숫자판 맨위 7부터 버튼을 부착한다.
		// 첫번째 줄 (백스페이스, CE, C를 제외한 첫번째 줄
		for(int i = 7; i <= 9; i++) {
			jplButtons.add(jbtnButtons[i]);
		}
		
		// 나누기 버튼과 sqrt버튼을 부착한다.
		jplButtons.add(jbtnButtons[13]);
		jplButtons.add(jbtnButtons[17]);
		
		// 두번째 줄 : 4, 5, 6 버튼을 부착한다.
		for(int i = 4; i <= 6; i++) {
			jplButtons.add(jbtnButtons[i]);
		}
		
		// *, x^2 버튼을 부착한다.
		jplButtons.add(jbtnButtons[14]);
		jplButtons.add(jbtnButtons[18]);
		
		// 세번째 줄 : 1, 2, 3 버튼을 부착한다.
		for(int i = 1; i <= 3; i++) {
			jplButtons.add(jbtnButtons[i]);
		}
		
		// -, % 버튼을 부착한다.
		jplButtons.add(jbtnButtons[15]);
		jplButtons.add(jbtnButtons[19]);

		// 네번째 줄 추가
		// 0, +/-, ., +, = 버튼을 부착한다.
		jplButtons.add(jbtnButtons[0]);
		jplButtons.add(jbtnButtons[10]);
		jplButtons.add(jbtnButtons[11]);
		jplButtons.add(jbtnButtons[16]);
		jplButtons.add(jbtnButtons[12]);
		
		jplMaster.setLayout(new BorderLayout());
		jplMaster.add(jplBackSpace,	BorderLayout.WEST);
		jplMaster.add(jplControl,	BorderLayout.EAST);
		jplMaster.add(jplButtons,	BorderLayout.SOUTH);
		
		// 백스페이스, CE, C, 숫자 및 기능 버튼이 부착되어있는 Panel을 출력 창 아래쪽에 배치한다.
		getContentPane().add(jplMaster, BorderLayout.SOUTH);
		// 포커스를 설정한다.
		requestFocus();
		
		// 각 버튼들에 리스너를 설정한다.
		for(int i = 0; i < jbtnButtons.length; i++) {
			jbtnButtons[i].addActionListener(this);
		}
		
		// 계산기 초기화
		clearAll();
		
		// JFrame의 우측 상단 x버튼 활성화
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	} // End - 생성자
	
	//-----------------------------------------------------------------------------------------------------------
	// 출력 창에 문자를 출력한다.
	//-----------------------------------------------------------------------------------------------------------
	void setDisplayString(String s) {
		jlbOutput.setText(s);
	}
	//-----------------------------------------------------------------------------------------------------------
	// 출력 창의 값을 가져온다.
	//-----------------------------------------------------------------------------------------------------------
	String getDisplayString() {
		return jlbOutput.getText();
	}
	//-----------------------------------------------------------------------------------------------------------
	// 숫자 키를 누르면 현재 값 뒤에다가 붙여서 output 창에 숫자를 출력한다.
	// 최대 20자(MAX_INPUT_LENGTH)까지
	//-----------------------------------------------------------------------------------------------------------
	void addDigitToDisplay(int digit) {
		
		// clearOnNextDigit
		// 계산기가 처음 시작되거나, 어떤 연산이 끝난 후에 값을 true로 한다.
		// 이때 숫자버튼을 누르면 출력창에 연산 전의 값은 보이지 않게 하고
		// 새로 계산할 숫자를 보여주기 위해서 출력창을 먼저 지운 후에 새로운 숫자를 보여준다.
		// 새로운 숫자를 입력하면 clearOnNextDigit의 값을 false로 만들어야
		// 다음 연산전까지 입력한 숫자를 지우지 않아야 연이어 입력한 숫자가 보여질 수 있다.
		if(clearOnNextDigit) {
			setDisplayString("");	// 출력 창을 지운다.
		}
		
		// 출력 창의 값을 가져온다.
		String inputString	= getDisplayString();
		
		// "ABCDEFGHIJ"
		// substring(2) : index번호 2번 뒤의 모든 값(2번 포함) ==> CDEFGHIJ
		// substring(2, 6) : index번호 2번 부터 6번 전까지 (2 <= index < 6) => CDEF
		
		// 맨 앞에 0이 있으면 0 뒤의 모든 값을 가져온다.
		if(inputString.indexOf("0") == 0) {
			inputString	= inputString.substring(1);
		}
		
		// 변수A.equals(변수B) : 변수A와 변수B가 같다.
		if( (!inputString.equals("0") || digit > 0) && inputString.length() < MAX_INPUT_LENGTH) {
			// 원래 창에 있던 값 뒤에 새로 입력한 값을 붙여서 출력한다.
			setDisplayString(inputString + digit);
		}
		displayMode			= INPUT_MODE;
		clearOnNextDigit	= false;
		
	}
	
	//-----------------------------------------------------------------------------------------------------------
	// 출력 창에 소숫점을 찍는다.
	//-----------------------------------------------------------------------------------------------------------
	void addDecimalPoint() {
		displayMode = INPUT_MODE;
		
		if(clearOnNextDigit) {
			setDisplayString("");
		}
		
		String inputString	= getDisplayString();	// 액정의 값을 가져온다.
		
		// 소숫점이 없으면 소숫점을 추가한다. 소숫점은 한번만 찍을 수 있다.
		if(inputString.indexOf(".") < 0)  {	// 소숫점이 한개도 없으면
			setDisplayString(new String(inputString + "."));
		}
	}
	
	//-----------------------------------------------------------------------------------------------------------
	// 출력 창의 숫자 부호를 바꾼다.
	//-----------------------------------------------------------------------------------------------------------
	void processSignChange() {
		if(displayMode == INPUT_MODE) {	// 입력모드
			String input = getDisplayString();
			
			// indexOf(String str) : 문자열에서 같은 문자의 위치를 찾는다.
			if(input.length() > 0 && !input.equals("0")) {
				if(input.indexOf("-") == 0) {	// 맨 앞에 -기호가 있다면
					setDisplayString(input.substring(1)); // -를 제거한 나머지 문자열을 출력창에 보여준다.
				} else {	// 출력 창의 값이 양수이면
					setDisplayString("-" + input);	// -를 맨 앞에 붙여서 출력 창에 보여준다.
				}
			}
		} else if(displayMode == RESULT_MODE) {	// 결과모드
			double numberInDisplay = getNumberInDisplay();
			
			if(numberInDisplay != 0) {
				displayResult(-numberInDisplay);
			}
		}
	}
	
	//-----------------------------------------------------------------------------------------------------------
	// 계산기 초기화
	//-----------------------------------------------------------------------------------------------------------
	void clearAll() {
		setDisplayString("0");
		lastOperator		= "0";
		lastNumber			= 0;
		displayMode			= INPUT_MODE;
		clearOnNextDigit	= true;
	}

	//-----------------------------------------------------------------------------------------------------------
	// 바로 전에 입력한 값을 지운다. CE 버튼을 누른 경우
	//-----------------------------------------------------------------------------------------------------------
	void clearExisting() {
		setDisplayString("0");
		clearOnNextDigit	= true;
		displayMode			= INPUT_MODE;
	}
	
	//-----------------------------------------------------------------------------------------------------------
	// 출력 창의 값을 가져온다.
	//-----------------------------------------------------------------------------------------------------------
	double getNumberInDisplay() {
		String input = jlbOutput.getText();
		return Double.parseDouble(input);
	}
	
	//-----------------------------------------------------------------------------------------------------------
	// 연산이 끝난 결과를 보여준다.
	//-----------------------------------------------------------------------------------------------------------
	void displayResult(double result) {
		setDisplayString(Double.toString(result));
		lastNumber			= result;
		displayMode			= RESULT_MODE;
		clearOnNextDigit	= true;
	}
	
	//-----------------------------------------------------------------------------------------------------------
	// 에러 발생시
	//-----------------------------------------------------------------------------------------------------------
	void displayError(String errorMessage) {
		setDisplayString(errorMessage);
		lastNumber			= 0;
		displayMode			= ERROR_MODE;
		clearOnNextDigit	= true;
	}
	
	//-----------------------------------------------------------------------------------------------------------
	// 사칙연산 버튼을 눌렀을 경우 처리하는 메서드
	// 입력받은 숫자를 처리한다. 한자리씩 입력받아서 계속 누적한다.
	// lastOperator : 지금 누른 연산자 바로 전의 연산자를 저장하는 변수
	// 12 + 3 인 상태에서 - 를 누르면 화면에 15를 출력한다.
	// ==> +를 누른 상태이지만 연산할 값이 하나 밖에 없는 상태이기 때문에 +연산을 할 상태가 아니므로
	//     lastOperator는 "0"이다.
	// 숫자 3을 더 입력한 상태에서 연산자(-)를 누르면, 그 전에 입력한
	// 12 + 3을 처리하기 위해서 lastOperator의 값인 +를 가지고 작업을 처리한다.
	//-----------------------------------------------------------------------------------------------------------
	void processOperator(String op) {
		if(displayMode != ERROR_MODE) {
			double numberInDisplay = getNumberInDisplay();
			System.out.println("lastOperator : " + lastOperator);
			
			if(!lastOperator.equals("0")) {
				try {
					double result = processLastOperator();
					displayResult(result);
					lastNumber = result;
				} catch (DivideByZeroException e) {
				}
			} else {
				// 연산자를 누르면 lastOperator는 0, 화면에 있는 값을 lastNumber에 저장한다.
				lastNumber = numberInDisplay;
			}
			clearOnNextDigit	= true;
			lastOperator		= op;
		}
	}
	
	//-----------------------------------------------------------------------------------------------------------
	// 연산을 처리하는 부분
	//-----------------------------------------------------------------------------------------------------------
	double processLastOperator() throws DivideByZeroException {
		double result			= 0;
		double numberInDisplay	= getNumberInDisplay();	// 두번째 값
		
		if(lastOperator.equals("/")) {
			if(numberInDisplay == 0)
				throw (new DivideByZeroException());
			result	= lastNumber / numberInDisplay;
		}
		if(lastOperator.equals("*")) {
			result	= lastNumber * numberInDisplay;
		}
		if(lastOperator.equals("-")) {
			result	= lastNumber - numberInDisplay;
		}
		if(lastOperator.equals("+")) {
			result	= lastNumber + numberInDisplay;
		}
		
		
		return result;
	}
	
	//-----------------------------------------------------------------------------------------------------------
	// = 버튼을 눌렀을 경우 처리하는 메서드
	//-----------------------------------------------------------------------------------------------------------
	void processEquals() {
		double result	= 0;
		
		if(displayMode != ERROR_MODE) {
			try {
				result = processLastOperator();
				displayResult(result);
			} catch (DivideByZeroException e) {
				displayError("0으로 나눌 수 없습니다.");
			}
			lastOperator = "0";
		}
	}
	
	//-----------------------------------------------------------------------------------------------------------
	// public void actionPerformed(ActionEvent e) : 이벤트 처리 부분
	//-----------------------------------------------------------------------------------------------------------
	@Override
	public void actionPerformed(ActionEvent e) {

		double result = 0;	// 연산 결과를 저장할 변수.
		
		// 각 키별로 이벤트 처리를 한다.
		// 숫자는 기본적으로 화면에 세팅한다.
		// 각 기능키는 각각의 기능을 처리한다.
		for(int i = 0; i < jbtnButtons.length; i++) 
		{
			if(e.getSource() == jbtnButtons[i]) 
			{
				switch(i) {
					case 0:	case 1:	case 2:	case 3: case 4:
					case 5:	case 6:	case 7: case 8: case 9:
						addDigitToDisplay(i);
						break;
						
					case 10:	// +/-
						processSignChange();
						break;
						
					case 11:	// 소숫점
						addDecimalPoint();
						break;
						
					case 12:	// =
						processEquals();
						break;
						
					case 13:	// 나누기
						processOperator("/");
						break;
						
					case 14:	// 곱하기
						processOperator("*");
						break;
						
					case 15:	// 빼기
						processOperator("-");
						break;
						
					case 16:	// 더하기
						processOperator("+");
						break;
						
					case 17:	// sqrt(제곱근)
						if(displayMode != ERROR_MODE) {
							try {
								// root의 -값은 허수이므로 처리가 않된다.
								if(getDisplayString().indexOf("-") == 0) {
									displayError("SQRT에 -값은 사용할 수가 없습니다.");
								}
								result = Math.sqrt(getNumberInDisplay());
								displayResult(result);
							} catch(Exception ex) {
								displayError("SQRT에 유효한 값이 아닙니다.");
								displayMode = ERROR_MODE;
							}
						}
						break;
						
					case 18:	// 1/x (역수 만들기)
						if(displayMode != ERROR_MODE) {
							try {
								if(getNumberInDisplay() == 0) {
									displayError("0으로 나눌 수 없습니다.");
								}
								result = 1 / getNumberInDisplay();
								displayResult(result);
							} catch (Exception ex) {
								displayError("0으로 나눌 수 없습니다.");
								displayMode = ERROR_MODE;
							}
						}
						break;
						
					case 19:	// % (백분율)
						if(displayMode != ERROR_MODE) {
							try {
								result = getNumberInDisplay() / 100;
								displayResult(result);
							} catch (Exception ex) {
								displayError("유효한 값이 아닙니다.");
								displayMode	= ERROR_MODE;
							}
						}
						break;
						
					case 20:	// backspace
						if(displayMode != ERROR_MODE) {
							// 출력 창에 있는 마지막 글자를 제외하고, 출력 창에 다시 보여준다.
							setDisplayString(getDisplayString().substring(0, getDisplayString().length()-1));
							
							// 마지막 남은 1자리를 지우면(backspace), 출력 창에 0으로 보여준다.
							if(getDisplayString().length() < 1) {
								setDisplayString("0");
							}
						}
						break;
						
					case 21:	// CE : 바로 전에 입력한 값만 지운다.
						clearExisting();
						break;
						
					case 22:	// C
						clearAll();
						break;
						
						
				} // End - switch()
			} // End - if
		} // End - for (각 버튼들에 해당하는 이벤트 처리)
		
		
	} // End - public void actionPerformed(ActionEvent e)
	
	
	//-----------------------------------------------------------------------------------------------------------
	// public static void main(String[] args)
	//-----------------------------------------------------------------------------------------------------------
	public static void main(String[] args) {
		Frame calc = new Frame();

		calc.setTitle("자바 계산기");
		calc.setSize(441, 417);
		
		calc.pack();
		
		calc.setLocation(500, 200);
		calc.setVisible(true);
		calc.setResizable(false);
		
	} // End - public static void main(String[] args)


} // End - public class Calculator extends JFrame implements ActionListener

//-----------------------------------------------------------------------------------------------------------
// class DivideByZeroException extends Exception
//-----------------------------------------------------------------------------------------------------------
class DivideByZeroException extends Exception {
	
	//-----------------------------------------------------------------------------------------------------------
	// 기본 생성자
	//-----------------------------------------------------------------------------------------------------------
	public DivideByZeroException() {
		super();
		System.out.println("super()");
	}
	//-----------------------------------------------------------------------------------------------------------
	// 매개 변수 있는 생성자
	//-----------------------------------------------------------------------------------------------------------
	public DivideByZeroException(String s) {
		super(s);
		System.out.println("super()");
	}
	
} // End - class DivideByZeroException extends Exception

 

 

 

 

 

 


 

 

 

 

 

26. JPanel 활용 - 사각형 그리기

 

 

 

package Swing.frame;

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.*;
import java.awt.*;

//-----------------------------------------------------------
// public class Frame2 extends JFrame 
//-----------------------------------------------------------
public class Frame2 extends JFrame {

	//-------------------------------------------------------
	// 생성자
	//-------------------------------------------------------
	Frame2() {
		setTitle("JPanel의 paintComponent() 연습");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(new MyPanel());
		setSize(800,600);
		setVisible(true);
	}
	
	class MyPanel extends JPanel{
		public void paintComponent(Graphics g) {
			// panel 내에 이전에 그려진 잔상을 지우기 위해 호출
			super.paintComponent(g);
			
			// 사각형의 선 색깔 => 그리기 전에 먼저 세팅해야함.
			g.setColor(Color.BLUE);
			// 사각형 그리기 (x, y, x축 길이, y축 길이 )
			g.drawRect(0, 0, 200, 200);
			
			g.setColor(Color.RED);
			g.drawRect(300, 200, 400, 200);
		}
	}
	
	//----------------------------------------------------------
	// public static void main(String[] args)
	//----------------------------------------------------------
	public static void main(String[] args) {
		new Frame2();
	} // End - public static void main(String[] args)
} // End - public class Frame2 extends JFrame

 

 

 

 

 

 


 

 

 

 

 

27. JPanel 활용 - 문자열 활용

 

 

 

package Swing.frame;


import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.*;
import java.awt.*;
//-----------------------------------------------------------------------
// public class Frame2 extends JFrame 
//-----------------------------------------------------------------------
public class Frame2 extends JFrame {

	//---------------------------------------------------------------------
	// 생성자
	//---------------------------------------------------------------------
	Frame2() {
		setTitle("문자열의 Color와 Font 사용 연습하기");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(new MyPanel());
		setSize(800,600);
		setVisible(true);
	}
	
	// Panel 클래스 
	class MyPanel extends JPanel{
		public void paintComponent(Graphics g) {
			// panel 내에 이전에 그려진 잔상을 지우기 위해 호출
			super.paintComponent(g);
			
			// 컴포넌트 색깔 => 그리기 전에 먼저 세팅해야함.
			g.setColor(Color.BLUE);
			// 문자 그리기 (내용, x, y)
			g.drawString("자바 is 존잼", 0, 10);

			// 컴포넌트 색깔 - RGB로 구성
			g.setColor(new Color(255, 0, 0));
			// 글씨 넣기 ("글씨폰트" , 기울기굵기 등, 글씨 크기 )
			// C:\Windows\Fonts  에 있는 폰트를 사용한다.
			// 고로 한글을 쓸거면 한글 폰트를 적어야 함.
			g.setFont(new Font("굴림", Font.ITALIC, 30 ));
			g.drawString("이야이야오", 30, 80);
	
			
			g.setColor(new Color(200, 100, 50));
			for(int i = 1; i <= 7; i++) {
				g.setFont(new Font("고딕", Font.ITALIC + Font.BOLD, i*10 ));
				g.drawString("이야이야오", 30, 100 + i*50);			
			}
		}
	}
	
	
	
	//---------------------------------------------------------------
	// public static void main(String[] args)
	//---------------------------------------------------------------
	public static void main(String[] args) {
		new Frame2();
	} // End - public static void main(String[] args)
} // End - public class Frame2 extends JFrame

 

 

 

 

 

 


 

 

 

 

 

28. JPanel 활용 - 선, 원, 사각형, 둥근 사각형, 부채꼴, 다각형 그리기

 

 

 

package Swing.frame;

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.*;
import java.awt.*;

//-----------------------------------------------------------
// public class Frame2 extends JFrame 
//-----------------------------------------------------------
public class Frame2 extends JFrame {

	//-------------------------------------------------------
	// 생성자
	//-------------------------------------------------------
	Frame2() {
		setTitle("도형 그리기");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(new MyPanel());
		setSize(800,600);
		setVisible(true);
	}
	
	// Panel 클래스 
	class MyPanel extends JPanel{
		public void paintComponent(Graphics g) {
			// panel 내에 이전에 그려진 잔상을 지우기 위해 호출
			super.paintComponent(g);
			
			// 컴포넌트 색깔 => 그리기 전에 먼저 세팅해야함.
			g.setColor(Color.RED);
			// 선 그리기 (시작x, 시작y, 끝x, 끝y)
			g.drawLine(0, 0, 100, 100);

			g.setColor(Color.BLUE);
			// 원 그리기 (왼쪽 위 사각형 x, y, width, height)
			g.drawOval(100, 100, 400, 400);

			g.setColor(new Color(150, 210, 80));
			// 사각형 그리기 (x, y, width, height)
			g.drawRect(100, 100, 400, 400);
			
			g.setColor(new Color(200, 50, 200));
			// 둥근 사각형 그리기 (x, y, width, height, roundx, roundy)
			g.drawRoundRect(200, 200, 200, 200, 100, 100);

			g.setColor(new Color(0, 0, 0));
			// 원호(부채꼴) 그리기 (x, y, width, height, 시작각도, 이동각도)
			g.drawArc(50, 50, 120, 120, 90, 90);

			g.setColor(new Color(200, 150, 50));
			// 다각형
			// x,y 좌표들의 인덱스 쌍으로 꼭지점 지정
			int[] x = {300, 250, 275, 325, 350};
			int[] y = {0, 30, 75, 75, 30};
			
			// (x, y, 좌표 갯수), 아래는 그래서 오각형~
			g.drawPolygon(x, y, 5);
		}		
	}
	
	//----------------------------------------------------------------
	// public static void main(String[] args)
	//----------------------------------------------------------------
	public static void main(String[] args) {
		new Frame2();
	} // End - public static void main(String[] args)
} // End - public class Frame2 extends JFrame

 

 

 

 

 

 

 


 

 

 

 

 

 

29. JPanel 활용 - 28번 도형들 색깔 채워 그리기

 

 

 

package Swing.frame;

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.*;
import java.awt.*;

//-----------------------------------------------------------
// public class Frame2 extends JFrame 
//-----------------------------------------------------------
public class Frame2 extends JFrame {

	//-------------------------------------------------------
	// 생성자
	//-------------------------------------------------------
	Frame2() {
		setTitle("도형 색 채워서 그리기");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(new MyPanel());
		setSize(800,600);
		setVisible(true);
	}
	
	// Panel 클래스 
	class MyPanel extends JPanel{
		public void paintComponent(Graphics g) {
			// panel 내에 이전에 그려진 잔상을 지우기 위해 호출
			super.paintComponent(g);
			
			// 컴포넌트 색깔 => 그리기 전에 먼저 세팅해야함.
			g.setColor(new Color(150, 210, 80));
			// 사각형 채워 그리기 (x, y, width, height)
			g.fillRect(100, 100, 400, 400);

			g.setColor(new Color(200, 50, 0));
			// 원 채워 그리기 (왼쪽 위 사각형 x, y, width, height)
			g.fillOval(100, 100, 400, 400);
			
			g.setColor(new Color(200, 50, 200));
			// 둥근 사각형 채워 그리기 (x, y, width, height, roundx, roundy)
			g.fillRoundRect(200, 200, 200, 200, 100, 100);

			g.setColor(new Color(0, 0, 0));
			// 원호(부채꼴) 채워 그리기 (x, y, width, height, 시작각도, 이동각도)
			g.fillArc(50, 50, 120, 120, 90, 90);

			g.setColor(new Color(200, 150, 50));
			// 다각형 채워 그리기
			// x,y 좌표들의 인덱스 쌍으로 꼭지점 지정
			int[] x = {300, 250, 275, 325, 350};
			int[] y = {0, 30, 75, 75, 30};
			
			// (x, y, 좌표 갯수)
			g.fillPolygon(x, y, 5);
		}		
	}
	
	//----------------------------------------------------------------
	// public static void main(String[] args)
	//----------------------------------------------------------------
	public static void main(String[] args) {
		new Frame2();
	} // End - public static void main(String[] args)
} // End - public class Frame2 extends JFrame

 

 

 

 

 

 

 


 

 

 

 

 

 

30. repaint() -  드래그로 원 그리기

 

 

 

package Swing.frame;

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.*;
import java.awt.*;

//-----------------------------------------------------------
// public class Frame extends JFrame 
//-----------------------------------------------------------
public class Frame extends JFrame {

	//-------------------------------------------------------
	// 생성자
	//-------------------------------------------------------
	Frame() {
		setTitle("마우스 드레깅으로 타원 그리기");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(new MyPanel());
		setSize(800,600);
		setVisible(true);
	}
	
	// Panel 클래스 
	class MyPanel extends JPanel{
		Point start = null, end = null;
				
		//-------------------------------------------------------
		// 생성자
		//-------------------------------------------------------
		public MyPanel() {
			MyMouseListener listener = new MyMouseListener();
			
			addMouseListener(listener);
			addMouseMotionListener(listener);
		}
		
		class MyMouseListener extends MouseAdapter{
			public void mousePressed(MouseEvent e) {
				start = e.getPoint();	// 마우스를 누른 곳의 좌표값을 가져온다.		
			}

			public void mouseDragged(MouseEvent e) {
				end = e.getPoint();	// 마우스를 누른 곳의 좌표값을 가져온다.	
				// repaint()가 호출이 되면 자바 플랫폼에 의해서 MyPanel의 paintComponent()가 호출이 된다.
				// 여기서 start와 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)
	//----------------------------------------------------------------
	public static void main(String[] args) {
		new Frame();
	} // End - public static void main(String[] args)
} // End - public class Frame extends JFrame

 

012

 

 

 

 

 


 

 

 

 

 

31. 오목 게임 만들기

 

 

 

package Swing.frame;

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

public class OmokGame extends JFrame implements MouseListener {
	
	final int LINE_NUM		= 19;	// 바둑판의 줄 수
	final int LINE_WIDTH	= 30;	// 바둑판의 줄 간격
	final int BOARD_SIZE	= LINE_WIDTH * (LINE_NUM - 1); 	// 바둑돌을 놓는 판 크기
	final int STONE_SIZE	= (int)(LINE_WIDTH * 0.8);		// 돌의 크기
	
	final int X0;	// 바둑판 격자의 시작 위치 x좌표
	final int Y0;	// 바둑판 격자의 시작 위치 y좌표
	
	final int FRAME_WIDTH;	// Frame 폭
	final int FRAME_HEIGHT;	// Frame 높이
	
	Image		Img			= null;
	Graphics	gImg		= null;
	
	boolean myTime = false;	// 검은돌, 흰돌의 순서를 나타내는 변수
	
	
	
	// 생성자
	public OmokGame(String title) {
		super(title);
		
		// Event Handler 를 등록한다.
		addMouseListener(this);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent we) {
				System.exit(0); // 우측상단의 x버튼을 누르면 프로그램을 종료한다.
			}
		});
		
		// 바둑판 배경색 설정
		setBackground(new Color(206, 167, 61));
		
		setVisible(true);	// Frame을 화면에 보이게 한다.
		Insets insets = getInsets();	// 화면이 보이기 전에는 Insets의 값을 구할 수가 없다.
		
		// 오목판이 그려질 위치(LEFT, TOP)의 좌표 X0, Y0를 지정한다.
		X0 = insets.left	+ LINE_WIDTH;
		Y0 = insets.top		+ LINE_WIDTH;
		
		// Frame의 크기를 계산
		FRAME_WIDTH = 2*LINE_WIDTH + BOARD_SIZE + insets.left + insets.right;
		FRAME_HEIGHT = 2*LINE_WIDTH + BOARD_SIZE + insets.top + insets.bottom;

		// Frame을 화면의 (100, 100)의 위치에 계산된 크기로 보이게 한다
		setBounds(100, 100, FRAME_WIDTH, FRAME_HEIGHT);
		
		// awt에서 깜빡임을 줄이기 위해서 더블 버퍼링을 구현하면
		// 필수적으로 쓰게 되는 메서드가 createImage()이다.
		Img = createImage(FRAME_WIDTH, FRAME_HEIGHT);
		gImg = Img.getGraphics();
		
		gImg.setColor(Color.BLACK);
		// Frame의 크기를 변경하지 못하게 한다.
		setResizable(false);
		// 바둑판에 줄을 그린다.
		drawBoard(gImg);
		
	} // public OmokGame(String title) - End
	
	
	public void paint(Graphics g) {
		if(Img == null) return;
		// 가상화면에 그려진 그림을 Frame에 복사한다.
		g.drawImage(Img, 0, 0, this);
	}
	
	// 바둑판에 줄을 그린다.
	public void drawBoard(Graphics g) {

		// 격자 그리기
		for(int i = 0 ; i <= 19 ; i ++) {
			// 세로줄 그리기
			g.drawLine(X0 + LINE_WIDTH*i, Y0, X0 + LINE_WIDTH*i, Y0+BOARD_SIZE );
			// 가로줄 그리기
			g.drawLine(X0, Y0 + LINE_WIDTH*i, X0+BOARD_SIZE, Y0 + LINE_WIDTH*i );
		}
		
	} // public void drawBoard(Graphics g) - End
	
	// MouseListener 클래스
	public void mousePressed(MouseEvent e){	}
	public void mouseClicked(MouseEvent e){	}
	public void mouseEntered(MouseEvent e){	}
	public void mouseExited(MouseEvent e){}
	public void mouseReleased(MouseEvent e){}


	
	// main 문
	public static void main(String[] args) {
		new OmokGame("미니 오목 게임");
	}
} // public class OmokGame extends JFrame implements MouseListener - End
728x90
반응형

댓글