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 : 실
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();
}
}
결과