Question 1.
Thread 클래스를 상속받아 실행 시작 10초 후에 자동으로 종료하는 스레드를 작성하라. 스레드가 실행을 시작하면 타이틀 바에 "실행 시작"이라고 출력하고, 컨텐트팬의 바탕색은 노란색으로 하라. 스레드는 종료 직전 타이틀 바에 "실행 종료"라고 출력하고 바탕을 파란색으로 변경하라.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import java.awt.*;
import javax.swing.*;
public class Question1 extends JFrame {
public Question1() {
this.setTitle("");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(getOwner());
getContentPane().setBackground(Color.YELLOW);
thread t = new thread();
t.start();
this.setSize(300, 200);
this.setVisible(true);
}
private class thread extends Thread {
public void run() {
setTitle("실행 시작");
try {
Thread.sleep(10000);
}
catch(InterruptedException e) { return; }
setTitle("실행 종료");
getContentPane().setBackground(Color.BLUE);
}
}
public static void main(String[] args) {
new Question1();
}
}
|
cs |
Question 2.
JPanel을 상속받은 패널에 지름이 50인 원이 500ms 간격으로 랜덤한 위치로 이동하는 프로그램을 작성하라. 이 패널을 컨텐트팬으로 사용하라.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
import java.awt.*;
import javax.swing.*;
public class Question2 extends JFrame {
public Question2() {
this.setTitle("원을 0.5초 간격으로 이동");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(getOwner());
this.setContentPane(new MyPanel());
Thread t = new Thread(new thread());
t.start();
this.setSize(300, 300);
this.setVisible(true);
}
private class MyPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
int x = (int)(Math.random()*(getWidth()-50));
int y = (int)(Math.random()*(getHeight()-50));
g.setColor(Color.MAGENTA);
g.drawOval(x, y, 50, 50);
}
}
private class thread implements Runnable {
public void run() {
while(true) {
repaint();
try {
Thread.sleep(500);
}
catch(InterruptedException e) { return; }
}
}
}
public static void main(String[] args) {
new Question2();
}
}
|
cs |
Question3.
"나는 당신을 사랑합니다."라는 문자열을 가지고, 0.5초 간격으로 한 글자씩 덧붙여 출력하고, 문자열이 모두 출력되면 처음부터 다시 반복하는 WalkingLabel 컴포넌트를 작성하라. WalkingLabel은 JLabel을 상속받도록 하라.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
import java.awt.*;
import javax.swing.*;
public class Question3 extends JFrame {
private JLabel WalkingLabel;
private String text;
private int length;
private int index = 1;
public Question3() {
this.setTitle("걸어서 나오는 문자열");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(getOwner());
getContentPane().setLayout(new FlowLayout());
WalkingLabel = new JLabel("나는 당신을 사랑합니다.");
add(WalkingLabel);
text = WalkingLabel.getText();
length = text.length();
Thread t = new Thread(new thread());
t.start();
this.setSize(300, 200);
this.setVisible(true);
}
private class thread implements Runnable {
public void run() {
while(true) {
WalkingLabel.setText(text.substring(0, index));
try {
Thread.sleep(500);
}
catch(InterruptedException e) { return; }
index++;
if(index > length) index = 0;
}
}
}
public static void main(String[] args) {
new Question3();
}
}
|
cs |
Question 4.
현재 시간 값으로부터 시작하는 디지털시계를 만들어라. 시계는 시, 분, 초 값을 가진다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
import java.awt.*;
import javax.swing.*;
import java.util.Calendar;
public class Question4 extends JFrame {
private Calendar c;
private int hour, min, second;
private JLabel time;
public Question4() {
this.setTitle("디지털 시계");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(getOwner());
Container ct = getContentPane();
ct.setLayout(null);
time = new JLabel();
time.setFont(new Font("Arial", Font.ITALIC, 80));
time.setBounds(35, 30, 400, 100);
ct.add(time);
Thread t = new Thread(new thread());
t.start();
this.setSize(400, 200);
this.setVisible(true);
}
private class thread implements Runnable {
public void run() {
while(true) {
c = Calendar.getInstance();
hour = c.get(Calendar.HOUR_OF_DAY);
min = c.get(Calendar.MINUTE);
second = c.get(Calendar.SECOND);
String clockText = Integer.toString(hour);
clockText = clockText.concat(":");
clockText = clockText.concat(Integer.toString(min));
clockText = clockText.concat(":");
clockText = clockText.concat(Integer.toString(second));
time.setText(clockText);
}
}
}
public static void main(String[] args) {
new Question4();
}
}
|
cs |
Question 5.
그림과 같이 아래에 총알을 발사하는 발사대가 있으며, 위에는 목표물(닭)이 왼쪽에서 오른쪽으로 지나간다. 사용자가 <Enter> 키로 빨간색 총알을 발사하여 목표물을 맞히는 게임을 작성하라. 목표물이 움직이는 시간을 20ms당 5픽셀이다. 목표물이 오른쪽을 벗어나면 다시 왼쪽에서 시작되며 총알이 움직이는 속도 역시 20ms당 5픽셀이다. 총알은 한 번에 한 개씩만 발사되며, 목표물을 명중하든지 위로 올라가 실패하여야 다음 발사가 가능하다. 목표물은 명중되면 처음 위치로 돌아가서 다시 움직이기 시작한다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Question5 extends JFrame {
private Thread tt;
private JLabel targetLabel;
private JLabel bulletLabel = new JLabel();
private JLabel baseLabel = new JLabel();
public Question5() {
this.setTitle("사격 게임");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(getOwner());
this.setContentPane(new GamePanel());
tt = new Thread(new targetThread());
tt.start();
this.setSize(300, 300);
this.setVisible(true);
}
private class GamePanel extends JPanel {
public GamePanel() {
this.setSize(300, 300);
this.setLayout(null);
targetLabel = new JLabel(new ImageIcon("images/chicken.jpg"));
targetLabel.setBounds(0, 0, 50, 50);
bulletLabel.setOpaque(true);
bulletLabel.setBackground(Color.RED);
bulletLabel.setBounds(getWidth()/2 - 5, getHeight() - 85, 10, 10);
baseLabel.setOpaque(true);
baseLabel.setBackground(Color.BLACK);
baseLabel.setBounds(getWidth()/2 - 20, getHeight() - 75, 40, 40);
add(targetLabel); add(bulletLabel); add(baseLabel);
this.addKeyListener(new KeyAdapter() {
Thread t = new Thread(new bulletThread());
public void keyPressed(KeyEvent e) {
if(e.getKeyChar() == '\n') {
if(t == null || !t.isAlive()) {
t = new Thread(new bulletThread());
t.start();
}
}
}
});
requestFocus();
setFocusable(true);
}
}
private class bulletThread implements Runnable {
public void run() {
while(true) {
int x = bulletLabel.getX();
int y = bulletLabel.getY() - 5;
if(y < 0) {
bulletLabel.setLocation(getWidth()/2 - 5, getHeight() - 85);
break;
}
else if((x > targetLabel.getX() && x < targetLabel.getX() + targetLabel.getWidth()) &&
(y > targetLabel.getY() && y < targetLabel.getY() + targetLabel.getHeight())) {
tt.interrupt();
targetLabel.setLocation(0, 0);
bulletLabel.setLocation(getWidth()/2 - 5, getHeight() - 85);
break;
}
else {
bulletLabel.setLocation(x, y);
}
try {
Thread.sleep(20);
}
catch(InterruptedException e) { return; }
}
}
}
private class targetThread implements Runnable {
public void run() {
while(true) {
int x = targetLabel.getX() + 5;
int y = targetLabel.getY();
if(x > getWidth()) {
x = 0;
}
targetLabel.setLocation(x, y);
try {
Thread.sleep(20);
}
catch(InterruptedException e1) {
try {
Thread.sleep(500);
}
catch(InterruptedException e2) {}
}
}
}
}
public static void main(String[] args) {
new Question5();
}
}
|
cs |
Question 6.
프레임 내 임의의 위치에 마우스로 찍으면 그 위치부터 한 개의 버블이 만들어지고 위로 움직인다. 버블이 완전히 프레임을 벗어나면 프로그램에서 삭제된다. 버블은 20ms마다 5픽셀씩 위로 이동한다. 마우스로 찍을 때마다 버블이 만들어지는 프로그램을 완성하라. 버블은 이미지 레이블로 구현하여도 되고, 그래픽으로 구현하여도 된다.
코드(이미지 레이블로 구현)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Question6 extends JFrame {
public Question6() {
this.setTitle("버블 게임");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(getOwner());
Container c = getContentPane();
c.setLayout(null);
c.addMouseListener(new MouseListener(){
public void mousePressed(MouseEvent e) {
Point p = e.getPoint();
JLabel img = new JLabel(new ImageIcon("images/bubble.jpg"));
img.setBounds(p.x, p.y, 50, 50);
c.add(img);
repaint();
Thread t = new Thread(new thread(img));
t.start();
}
public void mouseReleased(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
});
this.setSize(300, 300);
this.setVisible(true);
}
private class thread implements Runnable {
private JLabel img;
private final int bubble_move = 5;
public thread(JLabel img) {
this.img = img;
}
public void run() {
while(true) {
int x = img.getX();
int y = img.getY();
img.setLocation(x, y - bubble_move);
if(img.getY() + img.getHeight() < 0) {
remove(img);
}
try {
Thread.sleep(20);
}
catch(InterruptedException e) { return; }
}
}
}
public static void main(String[] args) {
new Question6();
}
}
|
cs |
코드(그래픽으로 구현)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Question6 extends JFrame {
public Question6() {
this.setTitle("버블 게임);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(getOwner());
this.setContentPane(new GamePanel());
this.setResizable(false);
this.setSize(300, 300);
this.setVisible(true);
}
private class Bubble extends JLabel {
public Bubble() {
setSize(50, 50);
}
public void paint(Graphics g) {
super.paint(g);
Image img = new ImageIcon("images/bubble.jpg").getImage();
g.drawImage(img, 0, 0, 50, 50, this);
}
}
private class GamePanel extends JPanel {
private Bubble b;
public GamePanel() {
setLayout(null);
this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
b = new Bubble();
add(b);
b.setLocation(e.getPoint());
if(b != null) {
Thread t = new Thread(new thread(b));
t.start();
}
}
});
}
}
private class thread implements Runnable {
private Bubble b;
public thread(Bubble b) {
this.b = b;
}
public void run() {
while(true) {
int x = b.getX();
int y = b.getY() - 5;
if(y + b.getHeight() + 10 < 0) {
b = null;
return;
}
else b.setLocation(x, y);
try {
Thread.sleep(20);
}
catch(InterruptedException e) { return; }
}
}
}
public static void main(String[] args) {
new Question6();
}
}
|
cs |
'☕ Java > 명품 자바 에센셜' 카테고리의 다른 글
명품 자바 에센셜 11장 실습 문제 (0) | 2019.05.22 |
---|---|
명품 자바 에센셜 10장 실습 문제 (0) | 2019.05.21 |
명품 자바 에센셜 9장 실습 문제 (0) | 2019.05.14 |
명품 자바 에센셜 8장 실습 문제 (0) | 2019.05.13 |
명품 자바 에센셜 7장 실습 문제 (0) | 2019.05.12 |