Ch07 Java Applets 物件導向系統實務
Applet Applets不是完全獨立的應用程式,而是在瀏覽器(IE或Netscape Navigater)或JDK(Java Developer’s Kit)提供的appletviewer中執行的程式 Applets程式被編譯後,在HTML檔案中加入applet標籤<applet>…</applet> 2018/11/18
Applet的執行 之前的Java程式: Java的applet程式: javac xxx.java java xxx 將產生的xxx.class內嵌於HTML檔案中 2018/11/18
Applet類別繼承關係圖 Java.lang.Object java.awt.Component java.awt.Container java.awt.Panel java.applet.Applet http://java.sun.com/j2se/1.5.0/docs/api/java/applet/package-tree.html 2018/11/18
Applet架構 Applet衍生自Appplet類別,所以必須引入java.applet 在視窗中執行applets必須載入AWT import java.applet.*; 在視窗中執行applets必須載入AWT import java.awt.*; 建立類別時宣告extends Applet,表示繼承Applet 在Applet類別不再需要main()方法 也不使用System.out.println(),而是使用AWT提供的方法paint() Public void paint(Graphics g) { g.drawString(“Hi, How Are You!”, 70, 100); } 2018/11/18
範例1:Ch04_01.java import java.applet.Applet; import java.awt.*; public class Ch04_01 extends Applet { public void paint(Graphics g) g.drawString("Hi How are you!", 70, 100); } 2018/11/18
範例1:Ch04_01.html <HTML> <head> <title>Ch04_01.html</title> </head> <body> <hr> <center> <applet code = Ch04_01.class width = 200 height = 200 > </applet> </center> </body> </html> 2018/11/18
Applet元件的屬性 <applet code = “xxx.class” width = x height = y > Xxx.class:在xxx.class中含有編譯過的applet類別 X, y:定義applet的繪圖區大小(像素) 大部份電腦螢幕所支援的解析度為800X600像素 2018/11/18
範例2:Ch04_02.java import java.applet.Applet; import java.awt.*; public class Ch04_02 extends Applet { public void paint(Graphics g) setBackground(Color.yellow); Font f = new Font("標楷體", Font.BOLD, 20); g.setFont(f); g.setColor(Color.red); showStatus("Java(4)"); g.drawString("嗨!你好!!", 70, 100); } 2018/11/18
Applet架構 Applet不是從main()開始執行,它有自己的一套特殊運作機制 四個重要的方法: init() start() stop() destroy() 2018/11/18
Applet架構 Init():當applet被啟動時,init()是最先被執行的方法,而且它只會被執行一次,所以,可將初始值放在此處 Start():它在init()執行後會執行一次,但是當網頁被離開後,再回來時,start()會被再執行,所以,applet的主程式碼會放在start() Stop():用來停止applet動作,或是網頁要跳去另一個網頁時,會呼叫start()方法 Destroy():當確定這個applet不會再用到時,可以呼叫destroy() 2018/11/18
Applet架構 Init() Start() Stop() Destroy() 2018/11/18
範例3:Ch04_03.java import java.applet.Applet; import java.awt.*; public class Ch04_03 extends Applet { String message = "啟動 / "; public void init() {message += "進入 init() / "; } public void start() { message += "進入 start() / "; public void paint(Graphics g) { setBackground(Color.yellow); Font f = new Font("標楷體", Font.BOLD, 20); g.setFont(f); g.setColor(Color.red); message += "進入 paint() / "; g.drawString(message, 10,10); 2018/11/18
Repaint()和update()方法 當applet要進行重新繪製視窗畫面時,applet先呼叫repaint()方法,repaint()再呼叫update()方法,update()方法再呼叫paint() 在一般情況下,我們不用去覆寫repaint()和update() 如果,要在程式某個地方,更新或重繪畫面時,只要呼叫repaint() Repaint(long tm)可以強迫在tm毫秒內執行重繪 2018/11/18
範例4:Ch04_04.java import java.applet.Applet; import java.awt.*; public class Ch04_04 extends Applet implements Runnable { Font f = new Font("標楷體", Font.ITALIC, 24); Thread t; String str; int m, n = 0; public void init() { str = "~~ 歡迎光臨 ~~"; } public void start() { t = new Thread(this); t.start(); public void paint(Graphics g) { setBackground(Color.cyan); g.setFont(f); if((n++)%2 == 1) { g.setColor(Color.green); } else { g.setColor(Color.red); } g.drawString(str, 30,50); } public void run() { while(true) { try { t.sleep(200); //每0.2秒執行一次 catch(InterruptedException e) {} repaint(); 2018/11/18
練習一:跑馬燈 修改Ch04_04.java,製作由左向右移動的跑馬燈 2018/11/18 Ex01_04_01.java + Ex01_04_01.html 2018/11/18
<applet>標籤屬性 <applet CODEBASE= CODE= ALT= NAME= WIDTH= HEIGHT= ALIGN= VSPACE= HSPACE= > </applet> CODEBASE:(非必要)指定applet所在的URL, 預設是html所在的位置 CODE: (必要)指定要執行的applet名稱*.class ALT: (非必要) 當使用者的瀏覽器不支援applet時, 要出現的提示語 NAME: (非必要) 用來applet取一個名字,如此同一 個網頁中的applet會知道有其他applet存在 WIDTH: (必要) 用來設定applet顯示範圍的寬度 HEIGHT: (必要) 用來設定applet顯示範圍的高度 ALIGN: (非必要) 調整applet在網頁上的位置 VSPACE: (非必要) 控制applet垂直間距的像素值 HSPACE: (非必要) 控制applet水平間距的像素值 2018/11/18
設定<applet>標籤內的參數 <param name=參數名稱 value=參數值> … </applet> 將applet視為方法,所以在html呼叫applet時,可以將一些參數傳給applet 2018/11/18
取得參數值getParameter() String s = getParameter(String n) //n 是<param>標籤內的name參數名稱 getParameter()方法,可以用來抓取從HTML中<param>標籤name屬性所代表的value屬性值 2018/11/18
範例5:Ch04_05.html <html> <head> <title> Ch04_05.html參數傳遞 </title> </head> <body> <applet code = “Ch04_05.class" width = "300" height = "200"> <param name = "msg" value = "~~歡迎光臨~~"> <param name = "x" value = "30"> <param name = "y" value = "150"> </applet> </body> </html> 2018/11/18
範例5:Ch04_05.java import java.applet.Applet; import java.awt.*; public class Ch04_05 extends Applet implements Runnable { Font f = new Font("標楷體", Font.ITALIC, 24); Thread t; String str; int m, n = 0; int m_x, m_y; public void init() { str = getParameter("msg"); m_x = Integer.parseInt(getParameter("x")); m_y = Integer.parseInt(getParameter("y")); } public void start() { t = new Thread(this); t.start(); public void paint(Graphics g) { setBackground(Color.cyan); g.setFont(f); if((n++)%2 == 1) { g.setColor(Color.green); } else { g.setColor(Color.red); g.drawString(str, m_x, m_y); public void run() { while(true) { try { t.sleep(200); //每0.2秒執行一次 catch(InterruptedException e) {} repaint(); 2018/11/18
Applet繪圖 方法 說明 setBackground(Color 顏色) 設定背景顏色 setForeground(Color 顏色) 設定前景色 drawString(String 字串, int X座標, int Y座標) 輸出字串 drawImage(Image 影像, int X座標, int Y座標) 畫一個影像 drawLine(int 起點X, int 起點Y, int 終點X, int 終點Y) 畫一條直線 drawRect(int 上, int 左, int 寬, int 高) fillRect(int 上, int 左, int 寬, int 高) 畫一個空心長方形 畫一個實心長方形 drawRoundRect(int 上, int 左, int 寬, int 高, int X角半徑, int Y角半徑) fillRoundRect(int 上, int 左, int 寬, int 高, int X角半徑, int Y角半徑) 畫一個空心圓角長方形 畫一個實心圓角長方形 drawOval(int 上, int 左, int 寬, int 高) fillOval(int 上, int 左, int 寬, int 高) 畫一個空心橢圓 畫一個實心橢圓 draw3DRec(int 上, int 左, int 寬, int 高) 畫一個3D的長方形 drawArc(int 上, int 左, int 寬, int 高, int 起始角度, int 移動角度) fillArc(int 上, int 左, int 寬, int 高, int 起始角度, int 移動角度) 畫一個弧形 畫一個扇形 drawPolyLine(int 座標X[], int 座標Y[], int 端點數) 畫多條線段 drawPolygon(int 座標X[], int 座標Y[], int 端點數) fillPolygon(int 座標X[], int 座標Y[], int 端點數) 畫一個空心多邊形 畫一個實心多邊形 2018/11/18
顏色常數(java. awt. color) http://java. sun. com/j2se/1. 5 Color.black 黑色 Color.blue 藍色 Color.cyan 青色 Color.darkGray 深灰色 Color.gray 灰色 Color.green 綠色 Color.lightGray 淺灰色 常數 顏色 Color.magenta 紫色 Color.orange 橘色 Color.pink 粉紅色 Color.red 紅色 Color.white 白色 Color.yellow 黃色 2018/11/18
範例6:Ch04_06.java import java.applet.*; import java.awt.*; public class Ch04_06 extends Applet { public void init() setBackground(Color.yellow); setForeground(Color.blue); } public void paint(Graphics g) g.drawRoundRect(20, 30, 80, 90, 0, 0);//長方形 g.drawRoundRect(140, 30, 80, 90, 50, 50); g.drawOval(260, 30, 90, 90); g.drawLine(380, 30, 480, 120); 2018/11/18
加入控制項到applet 文字方塊: 標籤方塊: 命令按鈕: Textfield 文字方塊物件 = new Textfield(int 字數); add(文字方塊物件); 文字方塊物件.addActionListener(this); 標籤方塊: Label 標籤方塊物件 = new Label(String 字串); add(標籤方塊物件); 命令按鈕: Button 命令按鈕物件 = new Button(String 字串); add(命令按鈕物件); 命令按鈕物件.addActionListener(this); 2018/11/18
範例7:Ch04_07.java攝氏轉華氏 import java.applet.*; import java.awt.event.*; public class Ch04_07 extends Applet implements ActionListener { Label lblCelsius, lblFahrenheit; TextField txtCelsius, txtFahrenheit; Button btnTransfer; public void init() { lblCelsius = new Label("攝氏"); lblFahrenheit = new Label("華氏"); txtCelsius = new TextField(20); txtFahrenheit = new TextField(20); btnTransfer = new Button("攝氏轉華氏"); add(lblCelsius); add(txtCelsius); add(lblFahrenheit); add(txtFahrenheit); add(btnTransfer); btnTransfer.addActionListener(this); } public void actionPerformed(ActionEvent e) { float f = Integer.parseInt(txtCelsius.getText()); f = f * 9 / 5 + 32; txtFahrenheit.setText(String.valueOf(f)); } 2018/11/18
範例8:Ch04_08.java紅綠燈控制 import java.applet.*; public void init() import java.awt.event.*; import java.awt.*; public class Ch04_08 extends Applet implements ActionListener { Button btnRed, btnYellow, btnGreen; int firstX = 65, firstY = 60; int secondX = firstX + 60, secondY = 60; int thirdX = firstX + 120, thirdY = 60; Color firstC = Color.red; Color secondC = Color.gray; Color thirdC = Color.gray; String msg = " 紅 燈 停 "; public void init() { setBackground(Color.cyan); btnRed = new Button("紅燈"); btnYellow = new Button("黃燈"); btnGreen = new Button("綠燈"); add(btnRed); add(btnYellow); add(btnGreen); btnRed.addActionListener(this); btnYellow.addActionListener(this); btnGreen.addActionListener(this); } 2018/11/18
範例8:Ch04_08.java紅綠燈控制 public void actionPerformed(ActionEvent e) { String str = e.getActionCommand(); if(str.equals("紅燈")) { firstC = Color.red; secondC = Color.gray; thirdC = Color.gray; msg = "紅 燈 停"; } else if(str.equals("黃燈")) { firstC = Color.gray; secondC = Color.yellow; msg = "黃 燈 預備停"; else if(str.equals("綠燈")) thirdC = Color.green; msg = "綠 燈 行"; repaint(); public void paint(Graphics g) { g.drawRect(firstX - 20, firstY - 20, 210, 90); //畫空心矩形 g.setColor(firstC); //設定第一個圓顏色 g.fillOval(firstX, firstY, 50, 50); //畫第一個圓 g.setColor(secondC); g.fillOval(secondX, secondY, 50, 50); g.setColor(thirdC); g.fillOval(thirdX, thirdY, 50, 50); g.setColor(Color.black); g.drawString(msg, secondX, secondY + 100); } 2018/11/18
練習二:紅綠燈 模擬路上的紅綠燈自動變燈,且提示字會隨燈號變色 提示: 拿掉按鈕的部份,ActionListener也一併拿掉 參考Ch04_04將燈號的改變,以sleep來處理 紅燈燈號持續5秒後,變成綠燈,綠燈持續5秒,再變成黃燈,黃燈持續1秒後,變成紅嬁 Ex01_08_01.java 2018/11/18