반응형
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 #실습 예제 #랜덤 모양과 위치의 타원 그리기 #마우스 리스너
반응형
'자바' 카테고리의 다른 글
자바 소스코드: Menu에 Action리스너 만들기 예제 (0) | 2016.12.22 |
---|---|
자바 소스코드: 메뉴바 만들기 (0) | 2016.12.22 |
자바 소스코드: 스레드를 가진 겜블링 (0) | 2016.11.23 |
자바 소스코드: 눈 내리는 풍경 (0) | 2016.11.23 |
자바 소스코드: 스네이크 움직이기 (3) | 2016.11.23 |