java applet

33
Java applet

Upload: sani

Post on 14-Feb-2016

59 views

Category:

Documents


0 download

DESCRIPTION

Java applet. ใช้ยังไง. มันรันจากหน้า html ซึ่งหน้านั้นต้องมี tag ที่บอกข้อมูล เอา applet อะไร ( class file อยู่ไหน) จะอยู่ตรงไหนในหน้า browser (size, location) Browser ต้องมี java plug-in นะ ดูตัวอย่างหน้าต่อไปเลย. ต้อง extends ตัวนี้. import java.awt.*; - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Java applet

Java applet

Page 2: Java applet

ใชยงไง• มนรนจากหนา html ซงหนานนตองม tag ทบอก

ขอมล– เอา applet อะไร (class file อยไหน)– จะอยตรงไหนในหนา browser (size, location)

• Browser ตองม java plug-in นะ• ดตวอยางหนาตอไปเลย

Page 3: Java applet

import java.awt.*;import javax.swing.*;

/** * @version 1.22 2007-06-12 * @author Cay Horstmann */public class NotHelloWorldApplet extends JApplet{ public void init() { EventQueue.invokeLater(new Runnable() { public void run() { JLabel label = new JLabel("Not a Hello, World applet",

SwingConstants.CENTER); add(label); } }); }}

ตอง extends ตวน

ตอจากนตองสราง html ทมแทกดงน

สงการอพเดท user interface ไปท event dispatch thread เพอใหรนขนานกบ main ตอไป

นถาจะเซตอะไรใน GUI กตองทำาในนจะดกวา invokeLater รเทรนทนท

เรยกเมอโหลดครงแรก

Page 4: Java applet

<applet code="NotHelloWorldApplet.class" width="300" height="100"></applet>แคนกเอาหนานเปนตวรนโปรแกรมจาวาเรา

ไดแลว

ลองใช appletviewer xxx.html เปดดกได

หรอเขยนแทกนในคลาสไฟลแลวใสคอมเมนกได ซง appletviewer กจะรนจากคลาสได

เลย

หนวยเปนพกเซล

Page 5: Java applet

แตตวนมนเหนแค applet ไมเหนสวนอนในหนา browser นน

ถามการคอมไพลใหม ตองปดและเปดบราวเซอรใหมเลย ไมงนโคดใหมไมโหลด

Page 6: Java applet

วธเปลยน application เปน applet• สรางหนา html ทโหลดคลาสได• สราง public class ท extends Japplet• เอา main method ทงไป• ไมตองสรางเฟรมหลกให GUI แลว เพราะมนจะอยใน

บราวเซอร• อะไรทเคยเขยนในคอนสตรคเตอรของเฟรมหลก ใหมา

เขยนใน init • ไมตองสราง applet ออบเจกต เพราะบราวเซอรทำาใหและ

บราวเซอรจะเรยก init ใหเอง• ไมตองเรยก setSize อกแลว เพราะทำาจากหนาเวบไง• ไมตองเรยก setDefaultCloseOperation เพราะวาตอนน

เราปดบราวเซอรแทน• ไมตองเรยก setTitle และ setVisible ดวยเชนกน

Page 7: Java applet

เมธอดตางๆทเราอาจตอง overridevoid start()รนทกครงทคนเขามาดหนาเวบทมแอพเพลต จากหนาอนvoid stop()รนทกครงทคนออกจากหนาเวบทมแอพเพลต ไปดหนา

อนvoid destroy()รนทกครงทบราวเซอรถกปดvoid resize(int width, int height)ยงทำางานกบบราวเซอรทวไปไมไดตอนน

Page 8: Java applet

Attribute ภายใน Tag• ถาม text อยใน applet tag มนจะถกแสดงเมอ

บราวเซอรนนแสดงตวแอพเพลตไมได• width, height อยาลมวา แอพเพลตนน resize ไมได• align บอก alignment ของตวแอพเพลต คาตางๆ

เหมอนคาในแทก img ของเวบ• vspace, hspace บอกจะเวนทในแนวตง (ทงบนและ

ลาง) และแนวนอน (ทงซายและขวา) หนวยเปนพกเซล• code บอกถง .class วาอยไหน ถาม package ตองใส

ใหถกตอง

Page 9: Java applet

• codebase url เพอใชหา .class ไฟล ใสชอเตมๆได• archive บอกจารไฟล หรอไฟลทโปรแกรมนใช วาอย

ทไหน ซงไฟลพวกนจะถกโหลดจากเวบเซอรเวอรกอนทแอพเพลตจะถกโหลด

ตวอยาง archive = “a.jar, corejava/corejavaclasses.jar’’

• object ใชบอกชอไฟลทม serialize แอพเพลตออบเจกต คอเราเกบคาของทกฟลดในไฟล ถาใชเมธอดน init จะไมถกเรยกแต start จะถกเรยก ใชกบการจำา state เอาไว

• name ใชตงชอแอพเพลต สำาหรบใหคนเขยนสครปตใชได เชนคนเขยน จาวาสครปต หรอใชใหสองแอพเพลตตดตอกนกได

Page 10: Java applet

สำาหรบ html 4.0

• ไมใช applet tag แลว ใช object tag แทน<object>

codetype=“application/java”classid=“java:MyApplet.class”width=“100” height=“150”

ม codebase ดวย ทำางานเหมอนเดมเลย

Page 11: Java applet

ถา applet ตองใชพารามเตอร• เราตองใสคาพารามเตอรลงใน html นนแหละ

ตวอยางเชน ให html เปนตวกำาหนด font ท applet จะใช

<applet code=“FontParamApplet.class” width=“100” height=“150”>

<param name=“font” value=“Helvetica”/>

</applet>

Page 12: Java applet

สวนการให applet อานพารามเตอรจากหนา html นน ใชเมธอด getParameter

public class FontParamApplet extends JApplet{public void init(){

…String fontname = getParameter(“font”);…

}…}

พารามเตอรนนเปนสตรงเสมอ ดงนนเราตองเปลยนไทปเองนะ

เชน int fontSize = Integet.parseInt(getParameter(“size”));

Page 13: Java applet

• จรงๆ คนทำาเวบอาจจะใหพารามเตอรมาไมครบ ดงนนในโคดเราจะตองดกวาเปน null หรอไมดวย

• ดตวอยาง applet ทวาดบารชารต

Page 14: Java applet

Html ของ applet barchart<applet code="Chart.class" width=400 height=300><param name="title" value="Diameters of the Planets"/><param name="values" value="9"/><param name="name.1" value="Mercury"/><param name="name.2" value="Venus"/><param name="name.3" value="Earth"/><param name="name.4" value="Mars"/><param name="name.5" value="Jupiter"/><param name="name.6" value="Saturn"/><param name="name.7" value="Uranus"/><param name="name.8" value="Neptune"/><param name="name.9" value="Pluto"/><param name="value.1" value="3100"/><param name="value.2" value="7500"/><param name="value.3" value="8000"/><param name="value.4" value="4200"/><param name="value.5" value="88000"/><param name="value.6" value="71000"/><param name="value.7" value="32000"/><param name="value.8" value="30600"/><param name="value.9" value="1430"/></applet>

จรงๆจะสรางอารเรยขนมาแลวใหทำางานอยในโคดกได แตแบบนจะเปลยนกราฟงายกวา

โดยไมตองคอมไพลโคดใหม และกยงทำา applet สองอนในหนาเวบเดยว

ไดดวย แคใสพารามเตอรคนละชดกน

Page 15: Java applet

รปราง ตอนรนออกมาแลวจะเปนแบบน

Page 16: Java applet

Code ของ applet barchartimport javax.swing.*;

public class Chart extends JApplet{ public void init() { EventQueue.invokeLater(new Runnable() { public void run() { String v = getParameter("values"); if (v == null) return; int n = Integer.parseInt(v); double[] values = new double[n]; String[] names = new String[n]; for (int i = 0; i < n; i++) { values[i] = Double.parseDouble(getParameter("value." + (i + 1))); names[i] = getParameter("name." + (i + 1)); }

add(new ChartComponent(values, names, getParameter("title"))); } }); }}

Page 17: Java applet

class ChartComponent extends JComponent{ /** * Constructs a ChartComponent. * @param v the array of values for the chart * @param n the array of names for the values * @param t the title of the chart */ public ChartComponent(double[] v, String[] n, String t) { values = v; names = n; title = t; }

public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g;

// compute the minimum and maximum values if (values == null) return; double minValue = 0; double maxValue = 0;

Page 18: Java applet

for (double v : values) { if (minValue > v) minValue = v; if (maxValue < v) maxValue = v; } if (maxValue == minValue) return;

int panelWidth = getWidth(); int panelHeight = getHeight();

Font titleFont = new Font("SansSerif", Font.BOLD, 20); Font labelFont = new Font("SansSerif", Font.PLAIN, 10);

// compute the extent of the title FontRenderContext context = g2.getFontRenderContext(); Rectangle2D titleBounds = titleFont.getStringBounds(title, context); double titleWidth = titleBounds.getWidth(); double top = titleBounds.getHeight();

ขอมลตางๆ วาฮารดแวรจะวาดฟอนตอยางไร เกบไวใชในการวาดฟอนตทหลง

Returns the logical bounds of the specified String in the specified FontRenderContext

Page 19: Java applet

// draw the title double y = -titleBounds.getY(); // ascent double x = (panelWidth - titleWidth) / 2; g2.setFont(titleFont); g2.drawString(title, (float) x, (float) y);

// compute the extent of the bar labels LineMetrics labelMetrics = labelFont.getLineMetrics("", context); double bottom = labelMetrics.getHeight();

y = panelHeight - labelMetrics.getDescent(); g2.setFont(labelFont);

// get the scale factor and width for the bars double scale = (panelHeight - top - bottom) / (maxValue -

minValue); int barWidth = panelWidth / values.length;

Y coordinate of the upper-left corner

The baseline of the first character is at position (x, y)

encapsulates the measurement information associated with a run of text

distance from the baseline to the descender line. ->the line beneath the lowercase ‘j’ and ‘y.’

Page 20: Java applet

// draw the bars for (int i = 0; i < values.length; i++) { // get the coordinates of the bar rectangle double x1 = i * barWidth + 1; double y1 = top; double height = values[i] * scale; if (values[i] >= 0) y1 += (maxValue - values[i]) * scale; else { y1 += maxValue * scale; height = -height; }

// fill the bar and draw the bar outline Rectangle2D rect = new Rectangle2D.Double(x1, y1, barWidth - 2, height); g2.setPaint(Color.RED); g2.fill(rect); g2.setPaint(Color.BLACK); g2.draw(rect);

// draw the centered label below the bar Rectangle2D labelBounds = labelFont.getStringBounds(names[i], context);

double labelWidth = labelBounds.getWidth(); x = x1 + (barWidth - labelWidth) / 2; g2.drawString(names[i], (float) x, (float) y); } } // จบ paintConponent

Page 21: Java applet

private double[] values; private String[] names; private String title;} // จบคลาส

Page 22: Java applet

เมธอดอนๆทนาสนใจ เวลาใชตอง override

public String getAppletInfo()รเทรนขอมล ผเขยน เวอรชน ลขสทธ

public String[][] getParameterInfo()รเทรนวา แอพเพลต รบพารามเตอรอะไรไดบาง

แตละrow จะมขอมลName, type และคำาอธบายพารามเตอร

Page 23: Java applet

ไฟลภาพกบเสยง• ภาพเปน png, gif, jpeg• เสยงเปน au, aiff, wav, midi• ตองใช location ของไฟลพวกนเปน relative urlgetDocumentBase รเทรน url ของหนาเวบทม

แอพเพลตgetCodeBase รเทรน url ของโฟลเดอร codebase

ของแอพเพลต

Page 24: Java applet

ตวอยางการเอาไฟลภาพกบเสยงมาใชImage cat = getImage(getCodeBase(),

“images/cat.gif”);

AudioClip meaw = getAudioClip(getCodeBase(), “audio/meaw.au”);

เลนเสยง โดย play(getCodeBase() ,“audio/meaw.au”)

Page 25: Java applet

void play(URL url) เลนไฟลจาก url เลยvoid play(URL url, String name)สตรงจะบอก relative path จากพารามเตอรแรก

AudioClip getAudioClip(URL, String name) กจะมสองเวอรชนเหมอนกน ถาหาไฟลไมเจอมนจะรเทรน null

getImage กเปนเชนเดยวกนน

Page 26: Java applet

Applet สงงาน browser ได• ตอง getAppletContext กอน คอเปนการเอาตว

เชอมระหวาง บราวเซอรกบโคดมาใช

Page 27: Java applet

สงขอมลระหวางสองแอพเพลต• ถาม <applet code =“Chart.class” width = “100” height=“100”

name=“Chart1”>เราสามารถเรยกพอยตเตอรของแอพเพลตขนมาไดApplet chart1 = getAppletContext().getApplet(“Chart1”);

แลวเรากเรยกเมธอดตางๆ ของchart1 จากอก applet ไดแลว เชน((Chart) chart1).setData(…..);

-

Page 28: Java applet

ตวอยาง เอาทกแอพเพลตออกมาปรน

Enumeration<Applet> e = getAppletContext().getApplets()l

While(e.hasMoreElements()){

Applet a = e.nextElement();System.out.println(a.getClass().getName());

Page 29: Java applet

• สงบราวเซอรใหพมพสตรงลง status lintshowStatus (”…”);

• สงบราวเซอรใหเปลยนไปดเวบอนURL u = new URL(“http:// ….”);getAppletContext().showDocument(u);

จะใหเปดหนาใหมกได ด showDocument เวอรชนตางๆเอานะ

Page 30: Java applet

Two in one เปนทง application และ applet

• สราง Jframe ทในเฟรมม applet อยใน content pane

public class AppletFrame extends JFrame implements AppletStub, AppletContext

{ public AppletFrame(Applet anApplet) { applet = anApplet; add(applet);……

Page 31: Java applet

• ใน main ใหเรา show AppletFrame

public class AppletApplication extends NotHelloWorldApplet{ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { AppletFrame frame = new AppletFrame(new

NotHelloWorldApplet()); frame.setTitle("NotHelloWorldApplet"); frame.setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); }

Page 32: Java applet

• เปลยน setVisible ของ AppletFrame ใหเรยก init กบ start

public void setVisible(boolean b) { if (b) { applet.init(); super.setVisible(true); applet.start(); } else { applet.stop(); super.setVisible(false); applet.destroy(); } }

Page 33: Java applet

• ตองระวง วาเกดไปเรยก getAppletContext().getApplet(“Chart1”) โดยทเปนแอพพลเคชน จะได null ซงทำาโปรแกรมเจงได

• ดงนนเราแกไดโดยใหโคดเราอมพลเมนอนเตอรเฟสอกสองตว แลวมา setStub

• ดโคดเอา มไฟลให