CS313: Object-Oriented Programming
บทที่ 9: Applet
บทที่ 9 Applet Applet เปนโปรแกรมซึ่งออกแบบใหประมวลผลผาน web browser หรือผาน applet viewer โดยทั่ว ไป applet เปนที่นิยมในงานที่ตองประมวลผลผานทาง Internet โครงสรางของโปรแกรม applet มีดังนี้ import java.applet.*; การ import class ที่จําเปน import java.awt.*; class AppletName extends Applet { member variable declarations public void init() { … } public void start() { … } public void stop() { … } public void destroy() { … } public void pain (Graphics g) { … }
วงจรชีวิตของ Applet
Method หลักของ applet สําหรับวาดรูปบน Applet
method declarations } โปรแกรมประเภท applet ตองเปน sub-class ของ class Applet ซึง่ กําหนดไวใน package java.applet 9.1 วงจรชีวิตของ applet applet มีวงจรชีวิตดังแสดงในแผนภาพตอไปนี้ init()
2/2545
start()
stop()
destroy()
1
CS313: Object-Oriented Programming
บทที่ 9: Applet
รายละเอียดของแตละขั้นตอนมีดังนี้ 1. Constructor stage ขัน้ ตอนนี้ไมปรากฏในวงจรชีวิตของ applet แตเปนขั้นตอนปกติของการ เขียนโปรแกรมเชิงวัตถุทั่วๆ ไป แมโปรแกรมที่เขียนจะไมมีคําสั่ง new โดยตรงในการสราง object แตเมื่อโปรแกรม applet เริม่ ตนทํางาน super-class ของโปรแกรมที่เขียนขึ้นจะสราง object ของ โปรแกรมโดยอัตโนมัติ และเริ่มประมวลผล 2. Initialisation method init() จะถูกเรียกประมวลผลโดยอัตโนมัติ เชนเดียวกับ constructor stage ในการเขียนโปรแกรมโดยทั่วไป ถาไมมีการเปลี่ยนแปลงคาตัวแปร หรือ ผานคาตัวแปรจาก HTML แลว ก็ไมมีความจําเปนที่จะตองเขียนชุดคําสั่งใดๆ ใน method นี้ แตถาตองการผานคา จาก HTML หรือมีการกําหนดคาเริ่มตนบางรายการ สราง object การกําหนดสี background หรือ load รูปภาพหรือตัวอักษร ซึ่งงานเหลานี้จะทําเพียงครั้งเดียวเมื่อ applet ถูกเรียกประมวล ผล ดังนัน้ งานอะไรก็ตามที่ตองการทําเพียงครั้งเดียวควรเขียนใน method init() 3. Starting งานทีต่ องทําตอจาก init() และเปนงานที่ตองการทําซํ้า โดยเฉพาะงานดานภาพ เคลือ่ นไหว หรือรอกิจกรรมโตตอบจากผูใชบริการ 4. Stopping เมื่อ applet ไมอยูในสภาพที่จะมองเห็น หรือไปประมวลผลที่ background งานตางๆ ทีต่ องทําในขั้นตอน start() สามารถที่จะหยุดไดชั่วคราว จนกวา applet กลับมา run ใหม ก็จะ เรียก start() กลับมาทํางานอีกรอบ 5. Destroying เมือ่ ผูใชไมตองการประมวลผล applet นัน้ ๆ อีกตอไป โปรแกรมควรมีการคืน resource ตางๆ ในกับระบบ 6. paint() เปน method ทีแ่ สดงผลทางจอภาพ ซึ่ง applet จะเรียกประมวลผลโดยอัตโนมัติ ในการ เขียนโปรแกรมทั่วๆ ไป ผูเขียนจะไมเรียก method paint() โดยตรง หากมีความจําเปนตองเปลี่ยน แปลงขอมูลบนจอภาพ การเขียนโปรแกรมจะตองเรียกประมวลผลผาน method repaint() หรือ update() ตัวอยาง import java.applet.*; import java.awt.*; import java.awt.event.*; public class LifeCycle extends Applet implements ActionListener { Label messageInit = new Label(“init()”); Label messageStart = new Label(“start()”); Label messageDisplay = new Label(“display()”); Label messageAction = new Label(“actionPerformed()”); Label messageStop = new Label(“stop()”); Label messageDestroy = new Label(“destroy()”); Button pressButton = new Button(“Press”); int countInit=0, countStart=0, countDisplay=0, countAction=0, countStop=0; int countDestroy=0; public void init() { ++countInit; add(messageInit); add(messageStart); add(messageDisplay);
2/2545
2
CS313: Object-Oriented Programming
บทที่ 9: Applet
ตัวอยาง (ตอ) add(messageAction); add(messageStop); add(messageDestroy); add(pressButton); pressButton.addActionListener(this); } public void start() { ++countStart; display(); } public void display() { ++countDisplay; messageInit.setText(“init() ”+countInit); messageStart.setText(“start() “+countStart); messageDisplay.setText(“display() “+countDisplay); messageAction.setText(“actionPerformed() ” + countAction); messageStop.setText(“stop() ”+countStop); messageDestroy.setText(“destroy() “+countDestroy); } public void stop() { ++countStop; display(); } public void destroy() { ++countDestroy; display(); } public void actionPerformed(ActionEvent e) { ++countAction; display(); } }
ทดลอง run โปรแกรมนี้โดยใช appletviewer แลวลอง minimize, restore และ maximize window ของโปรแกรมนี้ สังเกตการเปลี่ยนแปลง และทดลอง run โปรแกรมนี้ดวย browser อืน่ ๆ จะเห็นวาบาง browser ไมไดใหผลเหมือนกัน 9.2 หลักการในการเขียนโปรแกรมดวย Applet การเขียนโปรแกรมแบบ Applet จะเปนการทํางานในรูปของ GUI (Graphical User Interface) ใน การเขียนโปรแกรมแบบนี้ ตองพิจารณาสิ่งตางๆ ตอไปนี้
2/2545
3
CS313: Object-Oriented Programming
บทที่ 9: Applet
1. พิจารณา class ทีจ่ ะนํามาใชงานเปน class member หรือ instance member หากเปนการใช งาน instance member จะตองมีการสราง object ดวยคําสั่ง new เพือ่ ที่จะไดเรียกใช method ตางๆ ได ซึ่งการสราง object เหลานี้ จะปรากฎบนจอภาพได ก็ตอเมื่อใชคําสั่ง add() เพื่อเพิ่ม object เขาไปใน container ซึง่ เปนพื้นที่ที่ใชในการแสดง object ตางๆ ของ applet กอน 2. ตองคํานึงถึงภาพลักษณที่จะปรากฏบนจอภาพ วาจะใหอยูในรูปแบบใด 3. object ทีจ่ ะสรางขึ้น จะใหอยูในชวงชีวิตใดของ Applet 4. การประมวลผลที่ตองการให object ติดตอกับผูใชเปนแบบใด วิธีที่งายที่สุดคือ เรียกใช method actionPerformed() ซึง่ เปน method ของ class แบบ interface ชื่อ ActionListener ดังนั้นตอง ประยุกตใชแบบ implements โดยตอทาย extends Applet ในสวนของการประกาศ class 9.3 การสราง component และนําไปแสดงที่จอภาพ Component คือ object ทีป่ รากฏอยูบนหนาจอ window เชน ปุม (button) สวนสําหรับแสดงขอ ความ (label) ในการสราง component ประกอบไปดวย 2 ขั้นตอนหลัก คือ 1. สราง object ของ component ทีต่ องการ 2. เพิ่ม object ทีถ่ กู สราง ลงในสวนของ container ดวยคําสั่ง add() ( add() เปน method ใน class Container ซึง่ จัดเปน Applet ประเภทหนึ่ง ) ในสวนของการเพิ่ม object ทีต่ อ งการใหปรากฏใน container เมือ่ เริ่มโปรแกรม ควรทําใน method init () ซึง่ เปนสวนที่ Applet จะเริม่ ตนทํางาน หากมีการตอบสนองตอผูใช ใหทําการกําหนดขั้นตอนการประมวล ผลในสวนของ Listener และตอง overload method actionPerformed() ดังเชนตัวอยางที่ผานมา 9.4 การเปลี่ยนแปลงรูปแบบบนจอภาพ การเปลี่ยนแปลงรูปแบบ เชน สี background สีของตัวอักษร ขนาดของตัวอักษร สามารถทําไดโดย การเรียกใช method ทีอ่ ยูใน class AWT method ทีใ่ ชในการเปลี่ยนแปลงรูปแบบจอภาพ ที่ใชกันสวนใหญ สามารถสรุปไดดังนี้ -
2/2545
void setForeground(Color c) การกําหนดสีพื้นหนา เชน setForeground(Color.red) เปนการกําหนดสีพื้นหนาเปนสีแดง void setBackground(Color c) กําหนดสีพื้นหลัง เชน setBackground(Color.white) เปนการกําหนดสีพื้นหลังเปนสีขาว void setFont(Font f) เปนการกําหนดรูปแบบและขนาดตัวอักษร เชน กําหนดตัวอักษรแบบ TimesRoman ตัวหนา ขนาด 24 point สามารถเขียนไดเปน setFont(new Font(“TimesRoman”,Font.BOLD,24); void setLocation(int x, int y) 4
CS313: Object-Oriented Programming
-
-
บทที่ 9: Applet
กําหนดพิกัดตําแหนงที่จะแสดง component บนจอภาพ เชน กําหนดให object แสดงที่พิกัด (50,50) คือ object.setLocation(50,50); Color(int r, int g, int b) เปน class ทีใ่ ชในการกําหนดสี ซึ่งจะเปน object ทีต่ องสงผานไปยัง method setBackground () และ setForeground() setColor() สามารถใชคาคงที่ของ class Color เชน Color.red, Color.green, Color.black, Color.white, Color.blue, Color.yellow เปนตน Font(String name, int Style, int size) เปน class ทีใ่ ชสราง object ทีก่ าหนดรู ํ ปแบบและขนาดของตัวอักษร ในสวนของ Style จะมีให เลือก 3 แบบ คือ Font.PLAIN, Font.ITALIC และ Font.BOLD
ตัวอยาง import java.applet.*; import java.awt.*; import java.awt.event.*; public class HelloWorld extends Applet implements ActionListener { Button redBttn = new Button(“Red”); Button greenBttn = new Button(“Green”); Button blueBttn = new Button(“Blue”); Button bigFont = new Button(“Bigger Font”); Button smallFont = new Button(“Smaller Font”); int fontSize = 24; Color textColor = Color.green; Font textFont = new Font(“Serif”, Font.BOLD, fontSize); public void init() { setBackground(Color.lightGray); setForeground(Color.read); setFont(textFont); add(redBttn); redBttn.addActionListener(this); add(greenBttn); greenBttn.addActionListener(this); add(blueBttn); blueBttn.addActionListener(this); add(bigFont); bigFont.addActionListener(this); add(smallFont); smallFont.addActionListener(this); } public void paint(Graphics g) { g.setColor(textColor); g.setFont(new Font(“Serif”, Font.ITALIC,fontSize)); g.drawString(“Hello World !”, 80, 100); showStatus(“This is show Status Window”); }
2/2545
5
CS313: Object-Oriented Programming
บทที่ 9: Applet
ตัวอยาง (ตอ) public void actionPerformed(ActionEvent e) { System.out.println(e); System.out.println(e.getActionCommand()); if (e.getActionCommand().equals(“Red”)) textColor = Color.red; else if (e.getActionCommand().equals(“Blue”)) textColor = Color.blue; else if (e.getActionCommand().equals(“Green”)) textColor = Color.green; else if (e.getActionCommand().equals(“Bigger Font”)) fontSize += 5; else if (e.getActionCommand().equals(“Smaller Font”)) fontSize -= 5; repaint(); } }
9.5 การเขียนโปรแกรมรับขอมูลทาง keyboard แบบ Applet การเขียนโปรแกรมเพื่อรับขอมูลผาน keyboard แบบ Applet ตองเลือกใช class TextField หรือ TextArea สําหรับ class TextField มีการจัดการดังนี้ 1. การกําหนดให cursor พรอมรับขอมูล ณ text field ทําไดดวย method requestFocus() 2. การผานคาขอมูลที่ผูใชบริการไดบันทึกใน TextField มายังโปรแกรมเพื่อประมวลผล ทําไดโดยใช method getText() 3. การแสดงผลที่ TextField ทําไดโดยใช method setText() ตัวอยาง import java.applet.*; import java.awt.*; import java.awt.event.*; public class CalculateArea extends Applet implements ActionListener { Label lb1 = new Label(“Please Enter the radius of the circle”); Label lb2 = new Label(“Radius: “); Label lb3 = new Label(“Area: “); TextField txt1 = new TextField(10); TextField txt2 = new TextField(10); String t1; Font bigFont = new Font(“TimesRoman”, Font.ITALIC, 24); Font font1 = new Font(“TimesRoman”, Font.ITALIC, 16); Button calculate = new Button(“Calculate”); Button reset = new Button(“Reset”); public void init() { lb1.setFont(bigFont); lb1.setLocation(20,20); add(lb1);
2/2545
6
CS313: Object-Oriented Programming
บทที่ 9: Applet
ตัวอยาง (ตอ) lb2.setFont(font1); lb2.setLocation(20, 40); add(lb2); add(txt1); lb3.setFont(font1); lb3.setLocation(20, 60); add(lb3); add(txt2); add(calculate); calculate.setBounds(20,250,80,25); add(reset); calculate.addActionListener(this); reset.addActionListener(this); txt2.requestFocus(); } public void start() { calculate.addActionListener(this); reset.addActionListener(this); txt2.requestFocus(); } public void actionPerformed(ActionEvent thisEvent) { if (thisEvent.getActionCommand().equals(“Reset”)); txt1.setText(“ “); txt2.setText(“ “); txt2.requestFocus(); } else { t1 = txt1.getText().trim(); Double x = new Double(t1); double r = x.doubleValue(); double area = Math.PI*r*r; txt2.setText(“ “+area); } } }
9.6 การแสดงรูปและเสียง การอานและแสดงรูปภาพที่ Applet 1. คําสั่งในการอานแฟมขอมูลรูปภาพ ตัวอยาง Image the_picture = getImage(getCodeBase(), “image/word1.gif”); getCodeBase() เปน method ที่ return คาตําแหนงของแฟมขอมูล และสรางเปน URL (Universal Resource Location) เพือ่ อานแฟมขอมูลที่ตองการ 2. แสดงแฟมขอมูลรูปภาพที่จอของ Applet โดยใช method drawImage และสั่งประมวลผลที่ method paint โดยผาน class Graphics ดังนี้
2/2545
7
CS313: Object-Oriented Programming
บทที่ 9: Applet
public void paint (Graphics g) { … g.drawImage(the_picture, width, height, this); … } การใสเสียงใน Applet ไฟลเสียงที่สามารถใชงานได ตองมีรูปแบบขอมูลเปน .au เทานั้น AudioClip และ method ในการประมวลผลเสียงประกอบดวย void loop() : ใหเลนแฟมขอมูลเสียงโดยไมมีการหยุด void play() : เริม่ เลนแฟมขอมูลเสียง และจะเลนเพียงครั้งเดียว void stop() : หยุดเลน
ไฟลเสียงจะมี class เปน
ชุดคําสั่งในการอานและประมวลผลแฟมขอมูลเสียงมีดังนี้ 1. อานแฟมขอมูลเสียง AudioClip getAudioClip(URL) AudioClip getAudioClip(URL, string) เชน AudioClip aClip = getAudioClip(getCodeBase(),”sound.au”); 2. การสั่งประมวลผลใหเลนเสียง void play(URL) void play(URL, string) เชน aClip.play(); 3. กรณีทตี่ อ งการใหแฟมขอมูลเสียงเลนตอเนื่อง ควรมีการหยุดเลนของเพลงใน method stop() ของ Applet และสั่งใหเลนใน method start() 9.7 การรับคาตัวแปรผานโปรแกรม Applet ขอมูลที่สามารถสงให Applet ตองเปนแบบตัวอักษรเทานั้น ชุดคําสั่ง HTML ตองมีการเพิ่มคําสั่ง PARAM ภายในสวนของ tag <APPLET> .. โดยมีรูปแบบการใชงานดังนี้ <APPLET CODE=”YourApplet.class” WIDTH=350 HEIGHT=300>
2/2545
8
CS313: Object-Oriented Programming
บทที่ 9: Applet
โดยที่ param-name1 และ param-name2 เปนตัวแปรที่กําหนดใน class YourApplet นอกจากนี้ คําสั่งของ HTML ยังสามารถระบุตําแหนงของแฟมขอมูล Java class ไดกรณีที่แฟมขอมูล Java class อยูตาง directory กับแฟมขอมูล HTML เชน <APPLET CODE=”YourApplet.class” WIDTH=350 HEIGHT=300 CODEBASE=”classdir/”> ในสวนของ Applet เอง ตองมีคําสั่งในการรับขอมูลที่สงผาน HTML คือ String getParameter(String name); name ในที่นี้คือ param-name1 ในสวนของ HTML นัน่ เอง ตัวอยาง import java.applet.*; import java.awt.*; public class SampleApplet2 extends Applet { String message = “Hello World!!”; Color textColor = Color.blue; String pFntsize; String sColor; int fntsize = 24; Font fnt; public void init() { sColor = getParameter(“color”); pFntsize = getParameter(“font”); if (pFntsize != null) { fntsize = Integer.parseInt(pFntsize); fnt = new Font(“Serif”, Font.BOLD, fntsize); } else fnt = new Font(“Serif”, Font.BOLD,24); if (sColor.equals(“red”)) textColor = Color.red; } public void paint(Graphics g) { g.setFont(fnt); g.setColor(textColor); g.drawString(message, 130, 70); Graphics2D g2 = (Graphics2D) g; Rectangle box1 = new Rectangle(40, 10, 60, 30); g2.draw(box1); box1.translate(15, 25); g2.draw(box1); } } <APPLET CODE=”SampleApplet2.class”>
2/2545
9