JAVA

14일차

구자룡 2021. 4. 12. 17:11

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("아무키나 빨리 눌러 바 채우기");
	}
}

'JAVA' 카테고리의 다른 글

15일차  (0) 2021.04.13
13일차  (0) 2021.04.09
12일차  (0) 2021.04.08
11일차  (0) 2021.04.08
10일차  (0) 2021.04.07