자바

자바 소스코드: 랜덤 모양과 위치의 타원 그리기

드린 2016. 11. 23. 21:11
반응형
package javaapplication38;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;

class Ex12 extends JFrame{
    Ex12(){
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.add(new DrawingPanel());
        this.setSize(300, 300);
        this.setVisible(true);
    }
    
    class DrawingPanel extends JPanel{
        DrawingThread th;
        Rectangle r = new Rectangle(0,0,0,0);
        
        DrawingPanel(){
            this.addMouseListener(new MyMouseListener());
            th=new DrawingThread(this);
            th.start();
        }
        
        public void setObj(int x, int y, int w, int h){
            r.x=x;
            r.y=y;
            r.width=w;
            r.height=h;
        }
        
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            if(r.width==0||r.height==0){
                return;
            }
            g.setColor(Color.MAGENTA);
            g.fillOval(r.x, r.y, r.width, r.height);//사각형의 크기의 내접하는 원을 생성
        }
        
        class MyMouseListener implements MouseListener{

            @Override
            public void mouseClicked(MouseEvent me) {}

            @Override
            public void mousePressed(MouseEvent me) {}

            @Override
            public void mouseReleased(MouseEvent me) {}

            @Override
            public void mouseEntered(MouseEvent me) {
                setTitle("Make Drawing to Start");
                th.wakeup();//마우스가 프레임내로 들어오면 스레드를 실행시킨다.
            }

            @Override
            public void mouseExited(MouseEvent me) {
                setTitle("Make Drawing to Pause");
                th.pause();//마우스가 프레임밖으로 나가면 스레드를 일시정지 시킨다.
            }

        }
    }
    class DrawingThread extends Thread{
        boolean running =true;
        Object obj=new Object();
        DrawingPanel p;
        
        DrawingThread(DrawingPanel p){
            this.p=p;
        }
        
        public void wakeup(){
            running=true;//실행중인 상태 표시
            synchronized(obj){
                obj.notify();
            }
        }
        
        public void pause(){
            running=false;//실행중이지 않은 상태 표시
        }
        
        public void run(){
            try{
                synchronized(obj){
                    obj.wait();//실행중이면 스레드를 기다리게한다.
                }
            }
            catch(Exception e){return;}
            
            while(true){
                if(p.isValid()){//패널이 만들어져있다면
                    if(!running){//타원만들기 스레드가 실행중이지 않으면
                        try{
                            synchronized(obj){
                                obj.wait();//기다린다.
                            }
                        }
                        catch(Exception e){return;}
                    }
                    //타원크기정보를 랜덤으로 생성
                    int x=(int)(Math.random()*p.getWidth());
                    int y=(int)(Math.random()*p.getHeight());
                    int w=(int)(Math.random()*100)+1;
                    int h=(int)(Math.random()*100)+1;
                    //타원크기정보를 보내 만들게 한다.
                    p.setObj(x, y, w, h);
                    p.repaint();
                }
                try{
                    Thread.sleep(300);
                }
                catch(Exception e){return;}
            }
        }
    }
    
}
public class JavaApplication38 {
    public static void main(String[] args) {
        new Ex12();
    }
}

<결과>

2016/11/23 - [자바] - 자바 소스코드: 스레드를 가진 겜블링

2016/11/23 - [자바] - 자바 소스코드: 눈 내리는 풍경

2016/11/23 - [자바] - 자바 소스코드: 스네이크 움직이기

#자바 #자바 소스코드 #명품자바 프로그래밍 13장 12번 #타원 그리기 #Make Drawing to Start #Make Drawing to Pause #실습 예제 #랜덤 모양과 위치의 타원 그리기 #마우스 리스너

반응형