小台哥淺談 Java 的實作與應用(六) 製作生動活潑的 Web 頁面


 摘要

 由於Java語言之中有多執行緒的功能,使得製作一個圖
 文並茂而且生動活潑的全球資訊網頁面變得非常簡易。
 本文利用幾個程式的實例來說明如何
 製作這種自動自發的 HomePage。
本文全文見 HOPE NET 光碟月刊第27期,1996 年八月號。

會動的標示板 Applet



由於 Java 有了這個多執行緒的功能,要用 Java 來開發一個動態的全球資訊網的
頁面,就變得非常簡單了。下面的這個實例中,只用了三十多行程式碼就可以作出
一個會動的標示板。

01 /* Display Text Applet by: Symon Chang 02 03 04
 */
05  import java.applet.*;
06  import java.awt.Graphics;
07  import java.awt.Font;
08  public class DispText extends Applet implements Runnable  {
09     int x = 100;                        // 字的X座標
10     Thread myThread = null;             // 宣告一個執行緒
11     String message = "《網路劇坊─小台哥笑談網路實作與管理》";
12     public void init() {
13        setFont(new Font("TimesRoman",Font.BOLD,24));
14        myThread = new Thread(this);     // 設定這個執行緒
15     }
16     public void start() {
17        myThread.start();                // 啟動我的執行緒
18     }
19     public void run()  {
20         while (true) {                  // 跑個沒完
21             repaint();                  // 呼叫繪圖方法
22             x -= 10;                    // 改變字的X座標
23             try { Thread.sleep(500); }  // 小睡片刻
24             catch(Exception e) {}       // 錯了也不管
25         }
26     }
27     public void stop() {
28        myThread.stop();                 // 停止我的執行緒
29     }
30     public void paint(Graphics g) {     // 繪圖方法
31        int width =  size().width;       // 寬度
32        if ((x < 0) || (x > width)) x = width;   // 重來
33        g.drawString(message, x, 40);    // 畫字串
34     }
35   }    // 

請按我的電腦遊戲


利用上面這個相同的程式架構,加上一個在抽象視窗工具箱(AWT)之中的按鍵元 件,同一個標示板 Applet 就可以變成一個互動式的簡單電腦遊戲了。這個按鍵遊 戲的 Applet 執行結果如下:


必須用允許 Java 的瀏覽器才能玩到此圖!

招財進寶的 Applet


同一個標示板的 Applet ,我們只要略加修改它的文字,並且加上一些填畫弧形圓 的程式碼,就可以變成一個招財進寶的 Applet 了。

必須用允許 Java 的瀏覽器此圖才會動!

避免閃爍的招財進寶 Applet


/*

    招財進寶的 Applet
    @author: Symon Chang
    E-mail:  symonchang@earthlink.net
    URL:     http://home.earthlink.net/~symonchang
    copyright(c) 1996 Symon Chang, Symon & Associates






必須用允許 Java 的瀏覽器此圖才會動!

*/
import java.applet.*;
import java.awt.*;
public class GoodLuck extends Applet implements Runnable {
   int x , a = 0;
   Thread myThread = null;                 // 宣告一個執行緒
   boolean threadSuspended = false;
   Color someColors[] = new Color[50];     // 顏色矩陣
   String message[] = {"招 財 進 寶",
                       "Writting by Symon Chang",
                       "Good Luck"};
   int iColor =0, iMessage = 0;
   String myFont = "TimesRoman";
   int fontSize = 30;
   public void init()  {
      String sParameter;                     // 參數用
      sParameter = getParameter("FONT");     // 讀入參數
      if (sParameter != null)
         myFont = sParameter;
      sParameter = getParameter("FONTSIZE");
      if (sParameter != null)
      {
         try {
            fontSize = Integer.parseInt(sParameter);
         } catch (NumberFormatException e) {
            showStatus("Error: Font Size must be a number");
            fontSize = 30;
         }
      }
      setFont(new Font(myFont,Font.BOLD,fontSize));
      for (int i=0; i< 3; i++)
      {
         sParameter = getParameter("MESSAGE"+i);
         if (sParameter != null)
            message[i] = sParameter;
      }
      setBackground(Color.white);            // 設背景白色
      float c = 0.0f;                        // 設顏色矩陣
      for (int i=0; i < someColors.length;
           i++, c+= (1.0f/someColors.length))
         someColors[i] = Color.getHSBColor(c,1.0f,1.0f);
       x = size().width;                     // 字的X座標
       repaint();                            // 呼叫繪圖方法
   }
   public void start() {
      if (myThread == null) {
         myThread = new Thread(this);        // 設定這個執行緒
         myThread.start();                   // 啟動我的執行緒
      }
   }
   public void run()  {
      while (true) {                         // 跑個沒完
         repaint();                          // 呼叫繪圖方法
         try { Thread.sleep(75+x/5); }       // 改變小睡片刻速度
         catch(Exception e){                 // 抓住例外
         System.out.println("Error: "+ e);}  // 錯在何方?
      }
   }
   public void update(Graphics g) {
      paint(g);                              // 不清螢幕
   }
   public void paint(Graphics g) {           // 繪圖方法
       int width =  size().width;            // 寬度
       g.setColor(Color.white);              // 用背景的白色洗
       g.fillArc(0,0,100,100,315,90);        // 洗嘴巴
       g.drawString(message[iMessage],x,63); // 洗字
       if ((x < 40) || (x > width))          // 重來
       {
           iMessage = 1 - iMessage;
           x = width; iColor++;
           iColor %= someColors.length;      // 變顏色
       }
       g.setColor(someColors[iColor]);       // 設顏色
       x -= 10;  a = 35 - a;
       g.fillArc(0,0,100,100,45-a,270+a*2);  // 畫嘴巴
       g.drawString(message[iMessage],x,63); // 畫字串
       g.drawString(message[2],width -(iMessage*160+200),30);
   }
   public boolean mouseDown(java.awt.Event evt, int xx, int yy) {
      if (threadSuspended) {
          myThread.resume();                 // 恢復執行
      } else {
          myThread.suspend();                // 暫停執行
      }
      threadSuspended = !threadSuspended;    // 改變布林值
      return true;
   }
   public void stop()  {
      if (myThread != null) {
         myThread.stop();                    // 停止我的執行緒
         myThread = null;                    // 空白我的執行緒
      }
   }
   public String getAppletInfo() {           // 版權所有
      return new String(
      "GooLuck, copyright(c) 1996 Symon Chang, Symon & Associates");
   }
} // 

譚鈺鈿的太極圖 Applet


我的同事譚鈺鈿,也是我 Java 班上的學生寫了一個太極圖的動態頁面,我覺得她 的這個 Applet 很有創意,特別拿來和讀者分享。 程式的全文如下:


/*  Animation of the Tai Chi Symbolic Sign
 *  - the sign rotates, zooms in and out on screen
 *
 *               By: Cynthia Tam, June 96, Java class
 *      Modified by: Symon Chang, July 96
 * 
 * 
 */
import java.awt.*;
import java.applet.*;
public class TaiChi2 extends Applet implements Runnable {
   Thread myThread = null;
   int iWhatColor = 0;
   Color BlackWhite[] = { Color.black, Color.white } ;
   int a = 0, b = 0, c = 30, k = 1;
   public void init() {
      setBackground(Color.gray);           // 設背景灰色
   }
   public void start() {
     if (myThread == null) {
       myThread = new Thread(this);
       myThread.start();
     }
   }
   public void run() {
      while (myThread != null)
      {
          try  {  Thread.sleep(300+c); }
          catch(Exception e)  {
             showStatus("Error " + e);
          }
          repaint();
      }
   }
   public void update(Graphics g) {
      paint(g);                          // 不清螢幕
   }
   public void paint (Graphics g)
   {
      g.clearRect(a, b, c, c+1);         // 清除舊太極
      if ( b <= 6) { k= 1; a=0; c=30; }
      if ( b > 100) k= -1;
      a += (2-k)*5; b+= k*5; c += k*8;   // 計算新位置及大小
      drawTaiChi(g, a, b, c);            // 畫新太極
   }
   public void drawTaiChi (Graphics g, int x, int y, int w)
   {
      iWhatColor = 1 - iWhatColor;             // 黑白交替
      g.setColor(BlackWhite[iWhatColor]);
      g.fillArc(x, y, w, w, 270, 180);         // 畫半圓
      g.setColor(BlackWhite[1-iWhatColor]);
      g.fillArc(x, y, w, w, 90, 180);          // 畫半圓
      g.fillArc(x+w/4,y,w/2, w/2, 270, 180);   // 畫半圓
      g.setColor(BlackWhite[iWhatColor]);
      g.fillOval(x+w/4,y+w/2,w/2,w/2);         // 畫圓
      g.fillOval(x+w/16*7, y+w/6, w/8, w/8);   // 畫圓
      g.setColor(BlackWhite[1-iWhatColor]);
      g.fillOval(x+w/16*7,y+w/6+w/2,w/8,w/8);  // 畫圓
   }
   public void stop() {
     if (myThread != null) {
        myThread.stop();
        myThread = null;
     }
   }
}

Java(tm) is registered trademarks of SUN Microsystems, Inc.


歡迎對本站內容提出您的寶貴意見, E-mail: symonchang@earthlink.net

如需使用或引用本站的資料時,請注意各相關智慧和著作所有權。

回首頁 Back to Home 上一頁 Previous Page 下一頁 Next Page 任一頁 Any Page
Symon Chang 小台哥 Symon & Associates, CA. U.S.A symonchang@earthlink.net
Last modified: 08-16-96