국비 12일차_2

강지수·2023년 12월 28일
0

국비교육

목록 보기
23/97

reset 버튼 추가하기

강사님의 코드

package com.tech.gt001;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.plaf.FontUIResource;

class MyCounter5 extends JFrame implements ActionListener{
	private JLabel[] labels;
	private JButton buttons;
	private JButton resetbtn;
	private int[] numbers;
//		이미지 그릇
	private ImageIcon[] imgs;
	
	public MyCounter5() {
//		프레임 초기화 (화면 구성)
		setTitle("Slot Machine");
		setSize(500,300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JPanel panel=new JPanel();
		panel.setLayout(null);
		labels=new JLabel[3];
		numbers=new int[3];
//		이미지 저장 배열 객체 생성
		imgs=new ImageIcon[10];
//		배열에 각각 이미지 배치
		for (int i = 0; i < imgs.length; i++) {
			imgs[i]=new ImageIcon(i+".png");
		}
		for (int i = 0; i < labels.length; i++) {
			labels[i]=new JLabel(""+numbers[i]);
			labels[i].setSize(100,100);
			labels[i].setLocation(100+100*i,20);
			labels[i].setFont(new FontUIResource("Impact",Font.BOLD,100));
			labels[i].setIcon(imgs[0]);
			panel.add(labels[i]);
		}
		buttons=new JButton("머신땡겨");
		buttons.setSize(250,50);
		buttons.setLocation(100,150);
		buttons.addActionListener(this);
		panel.add(buttons);
		resetbtn=new JButton("reset");
		resetbtn.setSize(250,50);
		resetbtn.setLocation(100,200);
		resetbtn.addActionListener(this);
		panel.add(resetbtn);
		
		add(panel);
		setVisible(true);
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		System.out.println("신호호호호");
		
		if(e.getSource()==buttons) {
			for (int i = 0; i < labels.length; i++) {
//		랜덤으로 number 값 받아오기(0~9)
				numbers[i]=(int)(Math.random()*10);
				labels[i].setIcon(imgs[numbers[i]]);
			}
//		번호 3개가 동일하면 buttons 의 text를 축하축하 로 변경
			if(numbers[0]==numbers[1]&&numbers[1]==numbers[2]) {
				buttons.setText("축하축하");
			} else buttons.setText("머신땡겨");
		} else {
			buttons.setText("머신땡겨");
			for (int i = 0; i < labels.length; i++) {
				labels[i].setIcon(imgs[0]);
			}
		}
	}
}
public class SlotMachine5 {
	public static void main(String[] args) {
		new MyCounter5();
	}
}

결과


마우스 포인터를 입력받아 출력

package com.tech.gt001;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

class MyPanel extends JPanel{
//	buffer : 임시저장공간
	BufferedImage img=null;
//	좌표값
	int img_x=100,img_y=100;
	public MyPanel() {
		try {
			img=ImageIO.read(new File("ball.png"));
		}catch(IOException e) {
			e.printStackTrace();
		}
//		리스너를 직접 사용
		addMouseListener(new MouseListener() {
			
			@Override
			public void mouseReleased(MouseEvent e) {
				System.out.println("mouseReleased");
				
			}
			
			@Override
			public void mousePressed(MouseEvent e) {
				System.out.println("mousePressed");
				System.out.println("x좌표:"+e.getX());
				System.out.println("y좌표:"+e.getY());
				
			}
			
			@Override
			public void mouseExited(MouseEvent e) {
				System.out.println("mouseExited");
				
			}
			
			@Override
			public void mouseEntered(MouseEvent e) {
				System.out.println("mouseEntered");
				
			}
			
			@Override
			public void mouseClicked(MouseEvent e) {
				System.out.println("mouseClicked");
				
			}
		});
	}
}

public class BallControlMouse extends JFrame{
	public BallControlMouse() {
		setTitle("Ball Control Mouse");
		setSize(300,300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
//		MyPanel 생성자 호출
		add(new MyPanel());
		
		setVisible(true);
	}
	public static void main(String[] args) {
		new BallControlMouse();
	}
}

결과

창 안에 마우스가 들어오면 mouseEntered
창 밖으로 나가면 mouseExited
누르면 mousePressed
누를 때의 x,y 좌표 출력
떼면 mouseReleased
누르고 뗌의 동작 mouseClicked

를 출력함.


클릭 지점으로 공 출력

package com.tech.gt001;

import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

class MyPanel extends JPanel{
//	buffer : 임시저장공간
	BufferedImage img=null;
//	좌표값
	int img_x=100,img_y=100;
	public MyPanel() {
		try {
			img=ImageIO.read(new File("ball.png"));
		}catch(IOException e) {
			e.printStackTrace();
		}
//		리스너를 직접 사용
		addMouseListener(new MouseListener() {
			
			@Override
			public void mouseReleased(MouseEvent e) {
				System.out.println("mouseReleased");
				
			}
			
			@Override
			public void mousePressed(MouseEvent e) {
				System.out.println("mousePressed");
				System.out.println("x좌표:"+e.getX());
				System.out.println("y좌표:"+e.getY());
				
				img_x=e.getX();
				img_y=e.getY();
				repaint();
			}
			
			@Override
			public void mouseExited(MouseEvent e) {
				System.out.println("mouseExited");
				
			}
			
			@Override
			public void mouseEntered(MouseEvent e) {
				System.out.println("mouseEntered");
				
			}
			
			@Override
			public void mouseClicked(MouseEvent e) {
				System.out.println("mouseClicked");
				
			}
		});
	}
	@Override
		protected void paintComponent(Graphics g) {
			// TODO Auto-generated method stub
			super.paintComponent(g);
			System.out.println("repaint호출");
//			이미지 화면에 로드
			g.drawImage(img, img_x, img_y, null);
		}
}

public class BallControlMouse extends JFrame{
	public BallControlMouse() {
		setTitle("Ball Control Mouse");
		setSize(300,300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
//		MyPanel 생성자 호출
		add(new MyPanel());
		
		setVisible(true);
	}
	public static void main(String[] args) {
		new BallControlMouse();
	}
}

결과

초기값 x100,y100에 있던 공이 클릭 지점으로 옮겨짐


MouseListener : 5개의 method 모두 override 됨

MouseAdapter : 필요한 method 만 override 해서 쓰면 됨.

package com.tech.gt001;

import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

class MyPanel2 extends JPanel{
//	buffer : 임시저장공간
	BufferedImage img=null;
//	좌표값
	int img_x=100,img_y=100;
	public MyPanel2() {
		try {
			img=ImageIO.read(new File("ball.png"));
		}catch(IOException e) {
			e.printStackTrace();
		}
//		리스너를 직접 사용
		addMouseListener(new MouseAdapter() {
//		필요한 method 만 뽑아서 사용 가능
			@Override
			public void mousePressed(MouseEvent e) {
				System.out.println("mousePressed");
				System.out.println("x좌표:"+e.getX());
				System.out.println("y좌표:"+e.getY());
				
				img_x=e.getX();
				img_y=e.getY();
				repaint();
			}
		});
	}
	@Override
		protected void paintComponent(Graphics g) {
			// TODO Auto-generated method stub
			super.paintComponent(g);
			System.out.println("repaint호출");
//			이미지 화면에 로드
			g.drawImage(img, img_x, img_y, null);
		}
}

public class BallControlMouse2 extends JFrame{
	public BallControlMouse2() {
		setTitle("Ball Control Mouse");
		setSize(300,300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
//		MyPanel 생성자 호출
		add(new MyPanel2());
		
		setVisible(true);
	}
	public static void main(String[] args) {
		new BallControlMouse2();
	}
}

결과

mouseEnterd 등이 출력되지 않는 모습

유사 class
MouseAdapter, MouseMotionAdapter, KeyAdapter, FocusAdapter, WindowAdapter 등등


keyboard 입력 받아 출력

package com.tech.gt001;

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

class MyPanel3 extends JPanel{
//	buffer : 임시저장공간
	BufferedImage img=null;
//	좌표값
	int img_x=100,img_y=100;
	public MyPanel3() {
		try {
			img=ImageIO.read(new File("ball.png"));
		}catch(IOException e) {
			e.printStackTrace();
		}
//		리스너를 직접 사용
		addKeyListener(new KeyListener() {
			
			@Override
			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void keyReleased(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void keyPressed(KeyEvent e) {
				int keycode=e.getKeyCode();
				System.out.println("hihi");
				
			}
		});
		this.requestFocus();
		setFocusable(true);
	}
	@Override
		protected void paintComponent(Graphics g) {
			// TODO Auto-generated method stub
			super.paintComponent(g);
			System.out.println("repaint호출");
//			이미지 화면에 로드
			g.drawImage(img, img_x, img_y, null);
		}
}

public class BallControlMouse3 extends JFrame{
	public BallControlMouse3() {
		setTitle("Ball Control Mouse");
		setSize(300,300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
//		MyPanel 생성자 호출
		add(new MyPanel3());
		
		setVisible(true);
	}
	public static void main(String[] args) {
		new BallControlMouse3();
	}
}


키보드 방향키로 공 움직이기

package com.tech.gt001;

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

class MyPanel3 extends JPanel{
//	buffer : 임시저장공간
	BufferedImage img=null;
//	좌표값
	int img_x=100,img_y=100;
	public MyPanel3() {
		try {
			img=ImageIO.read(new File("ball.png"));
		}catch(IOException e) {
			e.printStackTrace();
		}
//		리스너를 직접 사용
		addKeyListener(new KeyListener() {
			
			@Override
			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void keyReleased(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void keyPressed(KeyEvent e) {
				int keycode=e.getKeyCode();
				System.out.println("hihi");
				
				switch (keycode) {
				case KeyEvent.VK_UP: {
					img_y-=10;
					break;
				}
				case KeyEvent.VK_DOWN: {
					img_y+=10;
					break;
				}
				case KeyEvent.VK_LEFT: {
					img_x-=10;
					break;
				}				
				case KeyEvent.VK_RIGHT: {
					img_x+=10;
					break;
				}
				default:
					break;
				}
				repaint();
			}
		});
		this.requestFocus();
		setFocusable(true);
	}
	@Override
		protected void paintComponent(Graphics g) {
			// TODO Auto-generated method stub
			super.paintComponent(g);
			System.out.println("repaint호출");
//			이미지 화면에 로드
			g.drawImage(img, img_x, img_y, null);
		}
}

public class BallControlMouse3 extends JFrame{
	public BallControlMouse3() {
		setTitle("Ball Control Mouse");
		setSize(300,300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
//		MyPanel 생성자 호출
		add(new MyPanel3());
		
		setVisible(true);
	}
	public static void main(String[] args) {
		new BallControlMouse3();
	}
}

결과


스레드 (Thread)

thread : 실

multi-tasking : 여러 개의 애플리케이션을 동시에 실행하여서 컴퓨터 시스템의 성능을 높이기 위한 기법 (= 병렬처리)
ex) 인쇄를 하면서 문서 편집을 할 수 있다.

thread : 하나의 프로그램이 동시에 여러 가지 작업을 할 수 있도록 하는 것, 각각의 작업을 thread라고 부른다.

proess : 자신만의 데이터를 가진다
thread : 동일한 데이터를 공유한다

게임 프로그램에서는 응답성을 높이기 위해 많은 thread를 사용한다.
GUI 에서는 마우스와 키보드 입력을 다른 thread 를 생성하여 처리한다.

Thread t = new Thread(); // 스레드 객체를 생성한다.
t.start(); // 스레드를 시작한다.

Thread class를 상속받는 방법 : Thread class를 상속받은 후에 run() method를 재정의한다. run() method 안에 작업을 기술한다.

Runnable 인터페이스를 구현하는 방법 : run() method를 가지고 있는 class를 작성하고, 이 class의 객체를 thread class의 생성자를 호출할 때 전달한다.

thread의 수명


package com.tech.gt002;

public class UseThread extends Thread{
	String message;
	public UseThread(String message) {
		this.message=message;
	}

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(i+":"+message);
		}
	}
	
	public static void main(String[] args) {
		Thread t=new UseThread("seoul");
		t.start();

	}

}

결과

0:seoul
1:seoul
2:seoul
3:seoul
4:seoul
5:seoul
6:seoul
7:seoul
8:seoul
9:seoul

package com.tech.gt002;

public class UseThread extends Thread{
	String message;
	public UseThread(String message) {
		this.message=message;
	}

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(i+":"+message);
		}
	}
	
	public static void main(String[] args) {
//		start방법 1
//		Thread t=new UseThread("seoul");
//		t.start();
//		start방법 2
		new UseThread("seoul").start();
		new UseThread("서울").start();
	}

}

결과

0:seoul
0:서울
1:서울
2:서울
3:서울
1:seoul
4:서울
2:seoul
5:서울
3:seoul
6:서울
7:서울
8:서울
9:서울
4:seoul
5:seoul
6:seoul
7:seoul
8:seoul
9:seoul

cpu를 먼저 점유한 값이 먼저 출력된다. (=random)


main 함수 역시 thread


package com.tech.gt002;

public class UseRunnable implements Runnable{
	String message;
	public UseRunnable(String message) {
		this.message=message;
	}
	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println(i+":"+message);
		}		
	}
	public static void main(String[] args) {
		new Thread(new UseRunnable("seoul")).start();
		new Thread(new UseRunnable("서울")).start();
	}

}

결과

0:seoul
1:seoul
0:서울
2:seoul
1:서울
3:seoul
2:서울
4:seoul
3:서울
5:seoul
6:seoul
7:seoul
8:seoul
9:seoul
10:seoul
4:서울
11:seoul
12:seoul
13:seoul
14:seoul
15:seoul
5:서울
16:seoul
17:seoul
6:서울
7:서울
8:서울
9:서울
10:서울
11:서울
12:서울
13:서울
14:서울
15:서울
16:서울
18:seoul
19:seoul
20:seoul
21:seoul
17:서울
22:seoul
18:서울
23:seoul
19:서울
24:seoul
20:서울
25:seoul
21:서울
26:seoul
22:서울
27:seoul
23:서울
28:seoul
24:서울
29:seoul
25:서울
30:seoul
26:서울
31:seoul
27:서울
32:seoul
33:seoul
28:서울
34:seoul
29:서울
35:seoul
30:서울
36:seoul
31:서울
37:seoul
32:서울
38:seoul
33:서울
39:seoul
34:서울
40:seoul
35:서울
41:seoul
36:서울
42:seoul
37:서울
43:seoul
44:seoul
45:seoul
46:seoul
38:서울
47:seoul
39:서울
48:seoul
40:서울
49:seoul
41:서울
50:seoul
42:서울
51:seoul
43:서울
52:seoul
44:서울
53:seoul
45:서울
54:seoul
46:서울
55:seoul
47:서울
56:seoul
48:서울
57:seoul
49:서울
58:seoul
50:서울
59:seoul
51:서울
60:seoul
52:서울
61:seoul
53:서울
62:seoul
54:서울
63:seoul
55:서울
64:seoul
56:서울
65:seoul
57:서울
66:seoul
58:서울
67:seoul
59:서울
68:seoul
69:seoul
60:서울
70:seoul
61:서울
71:seoul
62:서울
72:seoul
63:서울
73:seoul
64:서울
74:seoul
65:서울
75:seoul
76:seoul
66:서울
77:seoul
78:seoul
67:서울
79:seoul
68:서울
80:seoul
69:서울
81:seoul
70:서울
82:seoul
71:서울
83:seoul
72:서울
84:seoul
73:서울
85:seoul
74:서울
86:seoul
75:서울
87:seoul
76:서울
88:seoul
77:서울
89:seoul
78:서울
90:seoul
79:서울
91:seoul
80:서울
92:seoul
81:서울
93:seoul
82:서울
94:seoul
83:서울
95:seoul
84:서울
96:seoul
97:seoul
85:서울
98:seoul
86:서울
99:seoul
87:서울
88:서울
89:서울
90:서울
91:서울
92:서울
93:서울
94:서울
95:서울
96:서울
97:서울
98:서울
99:서울

Linux 미션
오늘은 생략


Windows 미션
size : 600, 250
(변형가능)

계산기 화면 출력

"Backspace", "", "", "CE", "C", "7", "8", "9", "/", "sqrt",
"4", "5", "6", "x", "%", "1", "2", "3", "-",
"1/x", "0", "+/-", ".", "+", "="

메일로 제출
text만 제출
메일제목 : 계산기_홍길동

초기 계산기 모양 구상


처음엔 왜 계산기 내부 숫자등을 저렇게 준지 몰랐는데 코드를 짜다보니 배열로 바로 넣어서 바로 버튼의 값으로 입력하면 되겠다는 생각이 들었다.
그리고 계산기 모양 구상도 바뀌었다.


package com.tech.mission;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.LayoutManager;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.plaf.FontUIResource;

//Windows 미션
//size : 600, 250
//(변형가능)
//
//계산기 화면 출력
//
//"Backspace", "", "", "CE", "C", "7", "8", "9", "/", "sqrt","4", "5", "6", "x", "%", "1", "2", "3", "-","1/x", "0", "+/-", ".", "+", "="
//
//메일로 제출
//tbasic@daum.net
//text만 제출
//메일제목 : 계산기_홍길동
class button extends JFrame{
	private JTextField result=new JTextField();
	private JButton[] buttons=new JButton[25];
	private String[] buttonStrings
			={"Backspace", "", "", "CE", "C", "7", "8", "9", "/", "sqrt","4", "5",
			"6", "x", "%", "1", "2", "3", "-","1/x", "0", "+/-", ".", "+", "="};

	public button() {
		setTitle("Calculator");
		setSize(600,350);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		JPanel calPanel=new JPanel();
		calPanel.setLayout(GridLayout(0, 2));
		result=new JTextField("");
		result.setBounds(50, 15, 480, 40);
		calPanel.add(result);

		for (int i = 0; i < buttonStrings.length; i++) {
			buttons[i]=new JButton(buttonStrings[i]);
			buttons[i].setSize(100 ,30);
			buttons[i].setLocation(10+110*i, 80);
			calPanel.add(buttons[i]);
		}
		for (int j=5;j<10;j++) {
			buttons[j].setLocation(10+110*(j-5),120);
		}
		for (int j=10;j<15;j++) {
			buttons[j].setLocation(10+110*(j-10),160);
		}
		for (int j=15;j<20;j++) {
			buttons[j].setLocation(10+110*(j-15),200);
		}
		for (int j=20;j<25;j++) {
			buttons[j].setLocation(10+110*(j-20),240);
		}
		
		add(calPanel);
		
		setVisible(true);
	}

	private LayoutManager GridLayout(int i, int j) {
		return null;
	}
}
public class Cal {
	public static void main(String[] args) {
		new button();
	}
}

결과


profile
개발자 준비의 준비준비중..

0개의 댓글