//
/* ---------------------------------------------------------------------------------------------- counter.java カウンタ ver. 1.01 (JDK 1.02) ueyama@infonet.co.jp 2000.03.11 ---------------------------------------------------------------------------------------------- */ import java.applet.Applet; import java.awt.*; import java.util.*; public class counter extends Applet implements Runnable { int Dec; // カウンタの値 int Wait=16, N=0; boolean Run=false; Image Img; Graphics gr; Thread th=null; public void init() { String bg=getParameter("BgColor"); int bgc=Integer.valueOf(bg,16).intValue(); setBackground(new Color(bgc)); MediaTracker mt=new MediaTracker(this); Img=getImage(getCodeBase(), getParameter("gif")); mt.addImage(Img, 0); try { mt.waitForID(0); } catch(InterruptedException e){}; gr=getGraphics(); Random rnd=new Random(); Dec=Math.abs(rnd.nextInt())%256; // カウンタ初期値(乱数) } public void start() { if(th==null) { th=new Thread(this); th.start(); } } public boolean inside(int x, int a, int b) { return (x<=Math.max(a,b) && x>=Math.min(a,b)) ? true:false; } public void dsp_p(int x, int y, int n, int c) { Graphics gx=gr.create(); int w=0, h=0, ox=0, oy=0; switch(n) { case 0: w=177; h=30; ox= 0; oy= 0; break; // カウンタ case 1: w= 15; h=22; ox=177; oy= 0; break; // 2進数 (0〜1) case 2: w= 10; h=14; ox=207; oy= 0; break; // 10進数 (1〜9, =) case 3: w= 47; h=11; ox=207; oy= 14; break; // "(10進数)" case 4: w= 44; h=11; ox=254; oy= 14; break; // "(2進数)" case 5: w= 26; h=23; ox= 0; oy= 30; break; // UP ボタン case 6: w= 26; h=23; ox= 52; oy= 30; break; // DOWN ボタン case 7: w= 26; h=23; ox=104; oy= 30; break; // RUN ボタン case 8: w= 26; h=23; ox=156; oy= 30; break; // STOP ボタン case 9: w= 26; h=23; ox=208; oy= 30; break; // FAST ボタン case 10: w= 26; h=23; ox=286; oy= 30; break; // SLOW ボタン case 11: w= 52; h=13; ox=298; oy= 14; break; // "カウンタ" } gx.clipRect(x,y,w,h); gx.clearRect(x,y,w,h); gx.drawImage(Img,x-(ox+c*w),y-oy,this); gx.dispose(); } public void dsp_s() // 数値の表示 { int i,j,m,n=0,x=0; for(j=128, i=0; i<8; i++,j/=2) // カウンタの値表示 { m=((Dec & j)==0)?0:1; dsp_p(42+22*i,24,1,m); dsp_p(x+13*i,70,2,m); } x+=13*i; dsp_p(x,73,4,0); // "(2進数)" の表示 dsp_p(x+49,70,2,10); // = の表示 m=Dec/100; dsp_p(x+64,70,2,(m>0)?m:11); if(m>0) n++; // 10進数表示 m=Dec/10; m%=10; dsp_p(x+77,70,2,(m+n>0)?m:11); m=Dec%10; dsp_p(x+90,70,2,m); dsp_p(x+103,73,3,0); // "(10進数)" の表示 } public void paint(Graphics g) { g.clearRect(0,0,size().width,size().height); dsp_p(101,0,11,0); // "カウンタ" の表示 dsp_p(38,20,0,0); // カウンタの表示 dsp_p( 54,100,6,0); // DEC ボタン dsp_p( 84,100,5,0); // INC ボタン dsp_p(114,100,10,0); // SLOW ボタン dsp_p(144,100,9,(Wait==1)?2:0); // FAST ボタン dsp_p(174,100,(Run)?8:7,0); // RUN ボタン dsp_s(); } public boolean mouseDown(Event e, int x, int y) { int i,m,n=99; if(inside(y,20,50) && inside(x,38,215)) // カウンタ数値変更 { m=7-(x-38)/22; n=1; for(i=0; i< m; i++) n*=2; if((Dec & n) ==0) Dec+=n; else Dec-=n; } if(y>100 && inside(x,54,200)) { if((x-54)%30<26) n=(x-54)/30; switch(n) { case 0: dsp_p( 54,100,6,1); Dec+=255; Dec%=256; break; case 1: dsp_p( 84,100,5,1); Dec++; Dec%=256; break; case 2: dsp_p(114,100,10,1); Wait*=2; break; case 3: if(Wait>1){dsp_p(144,100,9,1); Wait/=2;} break; case 4: dsp_p(174,100,(Run)?8:7,1); Run=!Run; break; } } dsp_s(); return true; } public boolean mouseUp(Event e, int x, int y) { int n=99; if(y>100 && inside(x,54,200)) { if((x-54)%30<26) n=(x-54)/30; switch(n) { case 0: dsp_p( 54,100,6,0); break; case 1: dsp_p( 84,100,5,0); break; case 2: dsp_p(114,100,10,0); dsp_p(144,100,9,0); break; case 3: dsp_p(144,100,9,(Wait==1)?2:0); break; case 4: dsp_p(174,100,(Run)?8:7,0); break; } } return true; } public void run() { while(true) { N++; try { th.sleep(100); } catch (InterruptedException e){} if(Run && N%Wait==0) { Dec++; Dec%=256; dsp_s(); } } } public void stop() { if(th!=null) { th.stop(); th=null; } } } //戻る