_ 1.4 Äpplen Uppgiften går ut på att visa hur man gör program som kan startas från ett HTML-dokument i en webbläsare och vi tittar först på program som kallas för äpplen. Man kan göra ett HTML-dokument dynamisk med JavaScript men vissa saker låter sig inte göras med JavaScript, exempelvis 3D-grafik, och därför är det i vissa fall bra med en teknik som äpplen. __ Uppgift Gör om ett program som du redan har, exempelvis från en tidigare kurs eller programmet från uppgiften [1.1 Multitrådning, 05_ass/ip1/1.1.txt], till ett äpple. Testkör sedan äpplet på två sätt: - Lägg filerna på den egna datorn och testkör med §appletviewer§ - Lägg filerna så de blir nåbara från Internet och testkör med §appletviewer§ Frivillig överkurs är att skapa ett HTML-dokument som gör att äpplet går att köra i en vanlig webbläsare. __ Exempel Ett enkelt exempel som utgår från uppgift [1.1 Multitrådning, 05_ass/ip1/1.1.txt] kan köras: - Från kommandoprompten med: §appletviewer http://atlas.dsv.su.se/~pierre/courses/05_ass/ip1/1/1.1/applet_version/thread_tester.html§ - Direkt i en webbläsare: [enkelt exempel, 05_ass/ip1/1/1.1/applet_version/thread_tester_in_browser.html] Ett roligare exempel med Mandelbrots mängd kan köras: - Från kommandoprompten med: §appletviewer http://atlas.dsv.su.se/~pierre/courses/05_ass/ip1/1/1.4/mandel/color/example_applet_tag.html§ - Direkt i en webbläsare: [enkelt exempel, 05_ass/ip1/1/1.4/mandel/color/example.html] __ Tips Äpplen körs i en så kallad sandlåda för att vara säkra, de får exempelvis inte använda filsystemet och får bara koppla sig tillbaka till det ställe som det laddades från. Äpplen kan vara osynliga i ett HTML-dokument, kan anropas av JavaScript och få parametrar från speciella HTML-taggar i ett HTML-dokument. Koden för ett äpple skiljer sig en del från koden i ett fristående program. Man har inte någon §main§-metod utan har istället följande speciella metoder: - §init§-metoden anropas av webbläsaren första gången den ser äpplet - §start§-metoden anropas av webbläsaren varje gång webbläsaren kommer tillbaka till äpplet - §stop§-metoden anropas av webbläsaren varje gång webbläsaren lämnar äpplet och går till en annan sida - §destroy§-metoden anropas av webbläsaren när webbläsaren avslutas Man behöver dock inte använda alla dessa metoder, ett exempel på ett minimalt äpple kan se ut enligt följande: § import javax.swing.*; public class X extends JApplet { public void init() { getContentPane().add(new JLabel("Hejsan!")); } } § Man startar inte ett äpple från kommandofönstret med §java X§ utan använder ett program speciellt för äpplen kallat §appletviewer§ som kör igång äpplet via ett HTML-dokument: § appletviewer x.html § HTML-dokumentet (säg filen §x.html§) innehåller en rad text som pekar ut äpplet: § § För §appleviewer§ räcker det med denna rad men om man vill köra äpplet i en vanlig webbläsaren (det är ju det som är idén bakom äpplen) så krävs lite annorlunda kod. Man kan i huvudsak göra detta på två sätt: - Via en i webbläsaren inbyggd Java-tolk som är ett dåligt sätt eftersom det inte stöds i många webbläsaren och i de fall det stöds så är det oftast en gammal Java-tolk version - Via Java Plug-in, se [Oracle: Java Plug-in Guide, http://download.oracle.com/javase/1.5.0/docs/guide/plugin/developer_guide/contents.html], som är ett bra sätt, möjligtvis med hjälp av verktyget HTML Converter, se [Oracle: More About HTML Converter, http://download.oracle.com/javase/1.5.0/docs/guide/plugin/developer_guide/html_converter_more.html] (se dock upp med HTML-koden som inte validerar som XHTML 1.1) Klassen §java.applet.Applet§ är användbar för att: - Läsa in ljud, bild och så vidare - Hitta andra äpplen på samma sida - Med mera Det är bra att göra en jar-fil av alla class-filer som ett äpple består av eftersom man då får hela programmet i en laddning och slipper avbrott i körningen när Java-tolken behöver hämta extra class-filer, nackdelen är att det initialt tar en något längre stund att få igång äpplet. Vill man göra en jar-fil till ett äpple så gör man lite annorlunda än för fristående program: § jar cf X.jar *.class § Man anger då startklassen med §code§-taggen: § § Notera att man inte behöver ha någon class-fil utan att den endast pekar ut startklassen. Själva filen pekas här istället ut av §archive="X.jar"§-attributet. Om man väljer att göra om uppgiften [1.1 Multitrådning, 05_ass/ip1/1.1.txt] till ett äpple så kan det vara lite småknepigt eftersom: - Huvudfönstret är själva webbläsaren och man kan då inte vara säker på att dess hantering av det grafiska gränssnittet är densamma som för en §JFrame§ (som har en egen tråd för det grafiska gränssnittet). När äpplets huvudtråd sover kan det låsa äpplets hantering av det grafiska gränssnittet (ingenting förändras) och en lösning på det problemet är att även göra så att huvudprogrammet blir trådat: § public class ThreadTester extends JApplet implements Runnable { private JTextArea textArea = new JTextArea(); private Thread thread = new Thread(this); public void init() { JScrollPane scrollPane = new JScrollPane(textArea); scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); getContentPane().add(scrollPane, BorderLayout.CENTER); thread.start(); } // Man får sedan göra utskrifterna i run-metoden. § Här använder vi en §JScrollPane§ för att få skrollning i text-arean och vill man ha automatisk skrollning (det vill säga utan att användaren behöver göra det) så kan man lägga till följande kod efter varje tillägg av text i text-arean: § textArea.setCaretPosition(textArea.getText().length()); § Glöm inte att man även måste göra om tråd-klasserna så att deras konstruktorer kan ta emot en §JTextArea§ som senare ska kunna användas för utskriften från trådarna. I denna uppgift räcker det med att man testar via §appletviewer§ men vill man testa i en riktig webbläsare som exempelvis Firefox och använda XHTML så ser taggen för äpplet ut enligt följande: § § Här är §X.class§ startklassen och §X.jar§ §jar§-filen. För de som är intresserade av Mandelbrots mängd så finns några tips om [Mandelbrots mängd, 03_material/docs/mandel/ip1.txt] för de som vill implementera uppgiften på detta sätt. Se även [Mandelbrot Viewer, http://math.hws.edu/xJava/MB/] som är gjort av [David J. Eck, http://math.hws.edu/eck/index.html] ett mycket fint program. Det kan även laddas ner som ett fristående program ([xMandelbrot.jar, 05_ass/ip1/1/1.4/supermandel/xMandelbrot.jar]). Testa med §MaxTerations = 5000§ och maximal storlek på programmet. Mycket fint! Man kan även studera den enormt vackra källkoden. __ Hjälp ~ 05_ass/help/01.txt > [Klicka här för hjälp, helper.dsv@gmail.com, IP Stationär: 1.4: Äpplen: http://people.dsv.su.se/~pierre/courses/i.cgi?href=05_ass/ip1/1.4.txt] < ~ 05_ass/help/02.txt