//
/* ---------------------------------------------------------------------------------------------- binary.java 2進数 ver. 3.00 (JDK 1.02) ueyama@infonet.co.jp 1999.04.25 update: 2008.09.05 ---------------------------------------------------------------------------------------------- */ import java.applet.Applet; import java.awt.*; public class binary extends Applet implements Runnable { int Nx=64, Ny=30, Bc=-1; // 数値表示座標 int Bin=0; // 表示数値 int Def=1; // 1: increment -1: decrement int Wait=1024; // 表示待ち時間 boolean Run=false; // true: Run false: Stop int Bx[]={126, 156, 186, 226, 256, 286}, By=260; // ボタンの表示座標値 Image Img; 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("figure")); mt.addImage(Img, 0); try { mt.waitForID(0); } catch(InterruptedException e){}; } 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_img(int x, int y, int m, int c) // 画像の表示 { int w=0, h=0, ox=0, oy=0; Graphics gx=getGraphics(); switch(c) { case 0: w= 32; h=78; ox= 0; oy= 0; break; // 2進数 数字 case 1: w= 37; h=46; ox= 64; oy= 0; break; // 16進数 数字 case 2: w= 58; h=17; ox= 64; oy=69; break; // "2, 10, 16進数" case 3: w= 26; h=23; ox= 64; oy=46; break; // ボタン case 5: w=181; h=12; ox=238; oy=69; break; // "Slow Run Fast Dec Clear Inc" case 6: w= 22; h=12; ox=418; oy=69; break; // "Run" or "Stop" } gx.clearRect(x, y, w, h); gx.clipRect(x, y, w, h); gx.drawImage(Img,x-(ox+m*w),y-oy,this); gx.dispose(); } public void dsp_num() // 数値の表示 { int i, j, k, m; for(i=0,j=128; i<8; i++,j/=2) dsp_img(39*i+Nx, Ny, ((Bin & j)==0)?0:1, 0); // 2進数の表示 m=Bin; j=16; for(i=0; i<2; i++) { dsp_img(39*i+Nx+24, Ny+140, m/j, 1); // 16進数の表示 m-=(m/j*j); j/=16; } m=Bin; j=100; for(i=0; i<3; i++) { dsp_img(39*i+Nx+174, Ny+140, m/j, 1); // 10進数の表示 m-=(m/j*j); j/=10; } } public void paint(Graphics g) { dsp_num(); dsp_img(Nx,0,0,2); // '2進数' dsp_img(Nx+24,110+Ny,2,2); // '16進数' dsp_img(Nx+174,110+Ny,1,2); // '10進数' dsp_img(Nx+120,140+Ny,16,1); // '=' の表示 dsp_img(Bx[0],By,(Wait<8192)?0:2,3); // Slow dsp_img(Bx[1],By,(Run)?18:3,3); // Run/Stop dsp_img(Bx[2],By,(Wait>64)?6:8,3); // Fast dsp_img(Bx[3],By,9,3); // Dec dsp_img(Bx[4],By,12,3); // Clear dsp_img(Bx[5],By,15,3); // Inc dsp_img(127,By+28,0,5); // "Slow Run Fast Dec Clear Inc" if(Run) dsp_img(Bx[1]+2,By+28,0,6); } public void run() { while(true) { try { th.sleep((Run)?Wait:256); } catch (InterruptedException e){} if(Run) { Bin+=(256+Def); // 数値の自動更新 Bin%=256; dsp_num(); // 数値の表示 } } } public void stop() { if(th!=null) { th.stop(); th=null; } } public boolean mouseDown(Event e, int mx, int my) { int m,n,i; Bc=-1; if(inside(my,Ny,Ny+78) && inside(mx,Nx,Nx+312)) // 2進数 数値編集 { m=7-(mx-Nx)/39; n=(int)Math.pow(2,m); // p = 2 ^ m if((Bin & n) ==0) Bin+=n; else Bin-=n; dsp_num(); // 数値の表示 } if(inside(my,By,By+23)) { for(i=0; i<6; i++) { if(inside(mx,Bx[i],Bx[i]+26)) // ボタンがクリックされた { switch(i) { case 0: if(Wait<8192) {Wait*=2; dsp_img(Bx[0],By,1,3);} break; // Slow case 1: Run=!Run; dsp_img(Bx[i], By, (Run)?4:19, 3); break; // Stop case 2: if(Wait>64) {Wait/=2; dsp_img(Bx[2],By,7,3);} break; // Fast case 3: Def=-1; Bin+=255; Bin%=256; break; // Dec case 4: Bin=0; break; // Clear case 5: Def=1; Bin+=Def; Bin%=256; break; // Inc } dsp_num(); // 数値の表示 if(i>2) dsp_img(Bx[i], By, i*3+1, 3); // ボタンの表示(緑) Bc=i; } } } return true; } public boolean mouseUp(Event e, int mx, int my) { if(Bc>=0) { switch(Bc) { case 0: dsp_img(Bx[0],By,(Wait<8192)?0:2,3); // Slow dsp_img(Bx[2],By,6,3); break; case 1: dsp_img(Bx[1], By, (Run)?18:3, 3); // Run or Stop dsp_img(Bx[1]+2,By+28,(Run)?1:0,6); break; case 2: dsp_img(Bx[2],By,(Wait>64)?6:8,3); // Fast dsp_img(Bx[0],By,0,3); break; default: dsp_img(Bx[Bc],By,Bc*3,3); // others } } return true; } } //戻る