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
반응형
'코딩수업 > AWS 클라우드환경 네이티브' 카테고리의 다른 글
8/24 자바(Java) 예외처리(Exception), 스레드(Thread), ArrayList (0) | 2022.08.25 |
---|---|
8/23 자바(Java) GUI 활용 - 오목 게임 만들기 이어서 (4) | 2022.08.24 |
8/19 자바(Java) GUI 활용, 8/18 빙고 만들기 이어서.... (0) | 2022.08.19 |
8/18 자바(Java) GUI 활용 - 마우스 리스너/모션 리스너와 빙고 만들기 (0) | 2022.08.18 |
8/17 자바(Java) GUI 활용 - 체크박스 및 이벤트 활용 (0) | 2022.08.17 |
댓글