반응형
package javaapplication29; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; class MyLabel extends JLabel{ int barSize=0;//바의 크기 int maxBarSize; MyLabel(int maxBarSize){ this.maxBarSize=maxBarSize; } 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 void fill(){ if(barSize==maxBarSize){ try{ this.wait();//바의 크기가 최대이면, ConsumerThread에 의해 바의 크기가 줄어들때까지 대기 } catch(Exception e){ return; } } barSize++; this.repaint();//바 다시그리기 this.notify();//기다리는 ConsumerThread 스레드 깨우기 } synchronized void consume(){ if(barSize==0){ try{ this.wait();//바의 크기가 0이면 바의 크기가 0보다 커질때까지 대기 } catch(Exception e){ return; } } barSize--; this.repaint();//바 다시 그리기 this.notify();//기다리는 이벤트 스레드 깨우기 } } class ConsumerThread extends Thread{ MyLabel con; ConsumerThread(MyLabel con){ this.con=con; } public void run(){ while(true){ try{ sleep(200); con.consume();//0.2초마다 바를 1씩 줄인다. } catch(Exception e){ return; } } } } class TabAndThreadEx extends JFrame{ MyLabel bar = new MyLabel(100);//바의 최대 크기를 100으로 지정 TabAndThreadEx(){ this.setTitle("아무키나 빨리 눌러 바 채우기"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLayout(null); bar.setBackground(Color.orange); bar.setOpaque(true); bar.setLocation(20, 50); bar.setSize(300,20); this.add(bar); //키 리스너 등록 this.addKeyListener(new KeyListener(){ @Override public void keyTyped(KeyEvent ke) { } @Override public void keyPressed(KeyEvent ke) { bar.fill();//키를 누를때마다 바가 1씩 증가 } @Override public void keyReleased(KeyEvent ke) { } }); this.setLocationRelativeTo(null); this.setSize(350,200); this.setVisible(true); this.requestFocus();//키 처리권 부여 ConsumerThread th = new ConsumerThread(bar);//스레드 생성 th.start();//스레드 시작 } } public class JavaApplication29 { public static void main(String[] args) { new TabAndThreadEx(); } }
<결과>
2016/11/14 - [자바] - 자바 소스코드: 스레드 충돌 예제
2016/11/14 - [자바] - 자바 소스코드: 스레드 충돌 방지 예제
2016/11/14 - [자바] - 자바 소스코드: ThreadFinishingFlag 예제(Java 무한 생산)
#자바 #자바 소스코드 #아무거나 빨리 눌러 바 채우기 #키 리스너 #paintComponent
반응형
'자바' 카테고리의 다른 글
자바 소스코드: 버블 게임(비눗방울 같은) (0) | 2016.11.23 |
---|---|
자바 소스코드: 움직이는 물체를 맞추는 사격 게임 (3) | 2016.11.23 |
자바 소스코드: 스레드 충돌 예제 (0) | 2016.11.14 |
자바 소스코드: 스레드 충돌 방지 예제 (0) | 2016.11.14 |
자바 소스코드: ThreadFinishingFlag 예제(Java 무한 생산) (0) | 2016.11.14 |