import java.util.Scanner;
class myth implements Runnable{
public void run() {
// TODO Auto-generated method stub
System.out.println("스레드 시작");
for(int i=0;i<10;i++) {
System.out.print(i+1+" ");
}
System.out.println();
System.out.println("스레드 종료");
}
}
public class Exam1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread th=new Thread(new myth());
Scanner sc=new Scanner(System.in);
System.out.print("아무 키나 입력>> ");
sc.nextLine();
th.run();
}
}
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Scanner;
import javax.swing.JFrame;
import javax.swing.JPanel;
class MyPanel extends JPanel{
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.magenta);
int x=(int)(Math.random()*300);
int y=(int)(Math.random()*300);
g.drawOval(x, y, 50, 50);
}
}
class myThread extends Thread{
MyPanel jp;
public myThread(MyPanel j) {
jp=j;
}
public void run() {
while(true) {
try {
sleep(500);
jp.repaint();
} catch (Exception e) {
return;
}
}
}
}
class myFrame extends JFrame{
MyPanel myp=new MyPanel();
myThread th=new myThread(myp);
public myFrame() {
setTitle("원을 0.5초 간격으로 이동하는 frame");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(myp);
myp.setLayout(null);
myp.setOpaque(true);
myp.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
th.start();
}
});
setVisible(true);
setSize(500,500);
}
}
public class Exam2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
new myFrame();
}
}
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class ChickenThread extends Thread {
private JLabel chickenLabel;
public ChickenThread(JLabel chickenLabel) {
this.chickenLabel=chickenLabel;
}
@Override
public void run() {
int i = 5;
while(true) {
if(chickenLabel.getX()>500) { //오른쪽 화면 밖으로 벗어나면
chickenLabel.setLocation(0, chickenLabel.getY());
}
chickenLabel.setLocation(chickenLabel.getX()+i, chickenLabel.getY());
try {
Thread.sleep(20); //20ms
}
catch(InterruptedException e) { //bulletThread에서 hitChicken()하면 interrupt()호출됨
chickenLabel.setLocation(0,0); //초기 위치로
try {
Thread.sleep(100);
}
catch(InterruptedException f) {
return;
}
}
}
}
}
class BulletThread extends Thread {
private JLabel bulletLabel;
private Thread chickenThread;
private JLabel chickenLabel;
public BulletThread(JLabel bulletLabel, Thread chickenThread, JLabel chickenLabel) {
this.bulletLabel=bulletLabel;
this.chickenThread=chickenThread;
this.chickenLabel=chickenLabel;
}
private boolean inChicken(int x, int y) {
if(((chickenLabel.getX() < x)
&& (chickenLabel.getX() + chickenLabel.getWidth()> x))
&&((chickenLabel.getY() < y)
&& (chickenLabel.getY() + chickenLabel.getHeight()> y))) {
return true;
}
else
return false;
}
// chickenLabel.getX() < x < chickenLabel.getX()+chickenLabel.getWidth()
// chickenLabel.getY() < y < chickenLabel.getY()+chickenLabel.getHeight()
private boolean hitChicken() { //bullet의 상단 좌우 점 하나에만 닿으면 HIT
if(inChicken(bulletLabel.getX(), bulletLabel.getY())
||inChicken(bulletLabel.getX()+bulletLabel.getWidth(), bulletLabel.getY())) {
return true;
}
else
return false;
}
@Override
public void run() {
int i = 5;
while(true) {
if(hitChicken()) {
try {
Thread.sleep(100);
}
catch(InterruptedException e) {return;}
chickenThread.interrupt();
bulletLabel.setLocation(bulletLabel.getX(), 390); //발사대 위 위치
return; //스레드 종료
}
else {
if(bulletLabel.getY()==0) { //위로 넘어가면
bulletLabel.setLocation(bulletLabel.getX(), 390); //발사대 위 위치
return; //스레드 종료
}
bulletLabel.setLocation(bulletLabel.getX(), bulletLabel.getY()-i);
try {
Thread.sleep(20);
}
catch(InterruptedException e) {return;}
}
}
}
}
public class Exam3 extends JFrame {
public Exam3() {
setTitle("사격 게임");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setFocusable(true);
c.requestFocus();
c.setLayout(null);
ImageIcon chickenImg = new ImageIcon("chicken.png");
JLabel chickenLabel = new JLabel(chickenImg);
chickenLabel.setSize(85, 85);
chickenLabel.setLocation(0,0);
c.add(chickenLabel);
JLabel bulletLabel = new JLabel();
bulletLabel.setSize(15,15);
bulletLabel.setOpaque(true);
bulletLabel.setBackground(Color.RED);
bulletLabel.setLocation(238,390);
c.add(bulletLabel);
JLabel baseLabel = new JLabel();
baseLabel.setSize(60,60);
baseLabel.setOpaque(true);
baseLabel.setBackground(Color.BLACK);
baseLabel.setLocation(215, 405);
c.add(baseLabel);
setSize(500,500);
setVisible(true);
setResizable(false);
ChickenThread cth = new ChickenThread(chickenLabel);
cth.start();
c.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
BulletThread bth = new BulletThread(bulletLabel, cth, chickenLabel);
if(bulletLabel.getY()==390||bulletLabel.getY()<0) //발사대 위 or 위로 넘어간 경우
bth.start();
}
}
});
}
public static void main(String[] args) {
new Exam3();
}
}
import javax.swing.*;
import java.awt.*;
import java.util.Calendar;
class cThread extends Thread {
private JLabel cLabel;
public cThread(JLabel cLabel) {
this.cLabel = cLabel;
}
public void run() {
while(true) {
Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int min = c.get(Calendar.MINUTE);
int 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));
cLabel.setText(clockText);
}
}
}
public class Exam4 extends JFrame {
public Exam4() {
super("디지털 시계 만들기");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout(FlowLayout.CENTER));
JLabel cLabel = new JLabel();
cLabel.setFont(new Font("Gothic",Font.ITALIC,80));
c.add(cLabel);
cThread th = new cThread(cLabel);
setSize(500,400);
setVisible(true);
th.start();
}
public static void main(String[] ar) {
new Exam4();
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class MyLabel extends JLabel {
private int barSize = 0; // 현재 그려져야할 바의 크기
private int maxBarSize; // 바의 최대 크
public MyLabel(int maxBarSize) {
this.maxBarSize = maxBarSize;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.MAGENTA);
int width = (int) (((double)(this.getWidth()))/maxBarSize*barSize);
if(width==0) return; // 크기가 0이기 때문에 바를 그릴 필요 없음
g.fillRect(0, 0, width, this.getHeight());
}
synchronized public void fill() {
if(barSize == maxBarSize) {
try {
wait(); // 바의 크기가 최대이면, ComsumerThread에 의해 바의 크기가 줄어들때까지 대기
} catch (InterruptedException e) { return; }
}
barSize++;
repaint(); // 바의 크기가 변했으니 다시 그리기
notify(); // 기다리는 ConsumerThread 스레드 깨우기
}
synchronized public void consume() {
if(barSize == 0) {
try {
wait(); // 바의 크기가 0이면 바의 크기가 0보다 커질 때까지 대기
} catch (InterruptedException e) { return; }
}
barSize--;
repaint(); // 바의 크기가 변했으니 다시 그리기
notify(); // 기다리는 이벤트 스레드 깨우기
}
}
class ConsumerThread extends Thread {
private MyLabel bar;
public ConsumerThread(MyLabel bar) {
this.bar = bar;
}
@Override
public void run() {
while(true) {
try {
sleep(200);
bar.consume(); // 0.2초마다 바를 1씩 줄인다.
} catch (InterruptedException e) { return; }
}
}
}
public class Exam7 extends JFrame {
private MyLabel bar = new MyLabel(100); // 바의 최대 크기를 100으로 설정
public Exam7(String title) {
super(title);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(null);
bar.setBackground(Color.ORANGE);
bar.setOpaque(true);
bar.setLocation(20, 50);
bar.setSize(300, 20); // 300x20 크기의 바
c.add(bar);
// 컨텐트팬에 키 이벤트 핸들러 등록
c.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
bar.fill(); // 키를 누를 때마다 바가 1씩 증가한다.
}
});
setSize(350,200);
setVisible(true);
c.setFocusable(true);
c.requestFocus(); // 컨텐트팬에게 키 처리권 부여
ConsumerThread th = new ConsumerThread(bar); // 스레드 생성
th.start(); // 스레드 시작
}
public static void main(String[] args) {
new Exam7("아무키나 빨리 눌러 바 채우기");
}
}