코딩수업/AWS 클라우드환경 네이티브

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

인생즐겜러 2022. 8. 22. 21:27
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
반응형