Sunteți pe pagina 1din 7

Artificii cu applet-uri Metoda showStatus()

Metoda showStatus() a clasei Applet v permite s afiai un ir n bara de stare a browserului care ruleaz applet-ul. Putei folosi aceast metod pentru afiarea mesajelor de eroare, a legturilor, pentru indicaii sau pentru alte mesaje de stare. Aceast metod poate fi apelat printr-o instruciune de genul: getAppletContext().showStatus(Pentru a ncepe, executati clic pe applet); Metoda getAppletContext() permite applet-ului dumneavoastr s acceseze caracteristicile browserului care l-a ncrcat. Metoda showStatus() folosete acest mecanism pentru a afia mesaje de stare.

Informatii despre applet


Biblioteca AWT (Abstract Windowing Toolkit) ofer un mecanism de declarare n cadrul applet-ului a unor informaii legate de autor, de drepturile de copiere sau alte informaii importante. Un browser Web poate oferi un mecanism de afiare a acestor informaii, dac acestea au fost definite de programatorul applet-ului. Pentru a oferi informaii legate de applet-ul dumneavoastr trebuie s suprascriei metoda getAppletInfo(), n modul urmtor: public String getAppletInfo() { return Copyright 2002 Popescu Ion }

Crearea de legturi n cadrul applet-urilor


Deoarece applet-urile ruleaz n cadrul browserelor Web, ar fi bine ca acestea s poat ncrca noi pagini Web. Java ofer un mecanism prin care se poate indica browserului s ncarce o nou pagin. De exemplu, putei folosi acest mecanism pentru a crea imagini animate care s ncarce o nou pagin la execuia unui clic pe suprafaa lor. Vei crea o instan a clasei URL pentru legtura ctre pagina dorit. Pentru a crea un nou obiect URL putei folosi unul dintre cei patru constructori: URL (String) creeaz un obiect URL cu o adres Web complet, cum ar fi http://www.prefect.com/java21 sau ftp://ftp.netscape.com. URL (URL, String) creeaz un obiect URL avnd o adres de baz provenit din obiectul URL specificat i o cale relativ provenit din irul transmis ca argument secund. Putei folosi getDocumentBase() pentru adresa URL a paginii care conine applet-ul sau getCodebase() pentru adresa URL a clasei applet-ului. Calea relativ va fi concatenat cu adresa de baz. URL (String, String, int, String) creeaz un obiect URL pornind de la protocol (cum ar fi http sau ftp), numele mainii (www.prefect.com, ftp.netcom.com etc.), numrul de port (80 pentru http)i un nume de fiier sau de director. URL (String, String, String) este identic cu constructorul anterior, minus argumentul ntreg cu numrul portului. Atunci cnd folosii constructorul URL (String), trebuie s tratai excepiile MalformedURLException. Pentru aceasta putei folosi un bloc try. . . catch, ca n exemplul urmtor: try { unURL = new URL ("http://www.mcp.com" ); } catch (MalformedURLException e) {

System.out.println("Adresa URL incorecta: " + unURL) ; } O dat obinut obiectul URL, tot ceea ce mai trebuie s facei este s l transmitei browserului; drept urmare, acesta va ncarca adresa respectiv: getAppletContext().showDocument(unURL); Browserul ce conine un applet Java cu codul prezentat mai sus va ncrca i va afia documentul de la adresa URL respectiv. Aplicaia urmtoare prezint dou clase: ButonLink i o clas ajuttoare Marcaj. Appletul ButonLink afieaz trei butoane care indic trei locaii Web diferite; dac se execut clic pe aceste butoane, va fi ncrcat documentul de la locaia respectiv. Textul surs al aplicaiei este prezentat n continuare: import java.awt.*; import java.net.*; public class ButonLink extends java.applet.Applet { Marcaj ListaMarcaje[] = new Marcaj[3]; public void init() { ListaMarcaje[0] = new Marcaj("Catalog auto", "http://www.masini.ro"); ListaMarcaje[1] = new Marcaj("Macmillan Computer Publishing", "http://www.mcp.com"); ListaMarcaje[2]= new Marcaj("JavaSoft", "http://java.sun.com"); GridLayout gl = new GridLayout(ListaMarcaje.length, 1, 10, 10); setLayout(gl); for (int i = 0; i < ListaMarcaje.length; i++) { add(new Button(ListaMarcaje[i].name)); } } public boolean action(Event evt, Object arg) { if (evt.target instanceof Button) { saltLa( (String)arg ); return true; } else return false; } void saltLa(String name) { URL theURL = null; for (int i = 0; i < ListaMarcaje.length; i++) { if (name.equals(ListaMarcaje[i].name)) theURL = ListaMarcaje[i].url; } if (theURL != null) getAppletContext().showDocument(theURL); } } class Marcaj {

String name; URL url; Marcaj(String name, String theURL) { this.name = name; try { this.url = new URL(theURL); } catch (MalformedURLException e) { System.out.println("URL inexistent: " + theURL); } } }

Comunicarea ntre applet-uri


Uneori dorii s folosii o pagin HTML care s conin mai multe applet-uri diferite. Pentru aceasta, tot ceea ce trebuie s facei este s folosii de mai multe ori eticheta <APPLET>. Browserul va crea diferite instane pentru fiecare applet care apare n pagin. Dar dac dorii s comunicai ntre aceste applet-uri? Dac dorii ca o modificare fcut ntrun applet s le afecteze cumva i pe celelalte? Cea mai bun modalitate de accesare a diferitelor applet-uri din pagin este de a folosi contextele. Un context reprezint un mijloc prin care se poate descrie mediul din care face parte ceva. n acest caz, contextul applet-ului este definit n clasa AppletContext i este folosit pentru comunicaia ntre applet-uri. Pentru a obine o instan a acestei clase pentru applet-ul dumneavoastr, vei folosi metoda getAppletContext(), i nu un anumit constructor. De exemplu, apelarea metodei trimiteMesaj() pentru toate applet-urile dintr-o pagin, inclusiv cel curent, folosete metoda getApplets() i un ciclu for de genul: for (Enumeration e = getAppletContext().getApplets(); e.hasMoreElements();) { Applet curent = (SubclasaMeaApplet) (e.nextElement()); curent.trimiteMesaj (); } Metoda getApplets() returneaz un obiect de tip Enumeration care conine o list a appleturilor din pagin. Parcurgerea acestei liste v permite s accesai pe rnd fiecare element. Reinei c fiecare element al obiectului Enumeration este o instan a clasei Object; pentru ca applet-ul s se comporte n modul dorit (i s accepte mesaje de la alte applet-uri) trebuie s l convertii prin cast la o instan a subclasei applet-ului dumneavoastr (n acest caz, clasa SubclasaMeaApplet). Apelarea unei metode ntr-un anumit applet este ceva mai complicat. Pentru aceasta, trebuie s asociai fiecrui applet un nume i s facei referirea prin numele respectiv. Pentru a asocia unui applet un nume se folosete atributul NAME al etichetei <APPLET>: <P>Acest applet trimite informatii: <APPLET CODE=AppletulMeu.class" WIDTH=100 HEIGHT=150 NAME=Expeditor> </APPLET> <P>Acest applet primeste informatii de la expeditor: <APPLET CODE="AppletulMeu.class" WIDTH=100 HEIGHT=150 NAME=Destinatar> </APPLET> Pentru a obine o referin la un alt applet din aceeai pagin se folosete metoda getApplet() pentru contextul applet-ului cu acel nume. Aceasta va avea ca rezultat obinerea unei referine la applet-ul cu numele respectiv. Dup aceasta, v putei referi la acest applet ca la oricare alt obiect: apelai metode, modificai variabilele de instan i aa mai departe. Iat codul care realizeaz acest

lucru: // accesati applet-ul destinatar Applet destinatar = (SubclasaMeaApplet)getAppletContext(). getApplet("Destinatar); // comandati-i sa se actualizeze destinatar.actualizare(text, valoare); n acest exemplu s-a folosit metoda getApplet() pentru a se obine o referin ctre applet-ul cu numele "Destinatar". Observai c obiectul returnat de getApplet() este o instan a clasei generice Applet; vei dori, probabil, s l convertii prin cast ctre o instan a subclasei dumneavoastr. O dat obinut referina ctre applet, putei apela apoi metodele sale ca i cnd ar fi orice alt obiect din mediul dumneavoastr de execuie. Aici, de exemplu, dac ambele applet-uri conin o metod denumit actualizare(), putei comanda applet-ului destinatar s se actualizeze singur folosind informaiile din applet-ul curent. Denumirea applet-urilor i referirea lor prin metodele prezentate n aceast seciune permit comunicarea i sincronizarea applet-urilor, obinndu-se astfel un comportament uniform pentru toate applet-urile din pagin.

Decuparea, copierea i lipirea


ncepnd cu versiunea 1.1 a Java s-a introdus suport pentru operaiunile de decupare, copiere i lipire (cut, copy, paste) ntre componentele folosite ntr-o interfa utilizator AWT i alte programe neimplementate n Java, care ruleaz pe aceeai platform. Anterior, AWT permitea doar copierea i lipirea datelor ntre componentele care posedau aceast facilitare pe platformele native (de exemplu, textul putea fi copiat i lipit numai ntre cmpuri sau zone de text). Aceast facilitate a fost extins astfel nct i alte date sau obiecte s poat fi transferate de la o component la alta. Pentru a transfera date de la o component la alta trebuie s definii un obiect transferabil, apoi s modificai sau s creai componente care s aib capacitatea de a transfera obiectul respectiv. Clasele i interfeele folosite n acest scop sunt coninute n pachetul java.awt.datatransfer.

Crearea de obiecte transferabile


Un obiect transferabil este un obiect care poate fi mutat dintr-o component n alta folosind mecanismul de transfer oferit de AWT i care ncapsuleaz un set de date ce urmeaz a fi transferate (de exemplu, text formatat). Mai concis, un obiect transferabil este un obiect care implementeaz interfaa Transferable. Atunci cnd creai un obiect transferabil, trebuie s decidei mai nti ce aspecte va suporta obiectul respectiv. Un aspect (flavor) este, n acest caz, formatul de date care urmeaz a fi transferat. De exemplu, dac vrei s copiai text formatat HTML dintr-un browser i s l lipii ntr-un alt loc, datele respective pot fi reprezentate n diferite formate: ca text formatat, ca text simplu sau drept cod HTML. Atributele datelor determin modul n care obiectul copiat i cel care urmeaz a fi lipit negociaz transferul de date propriu-zis. Dac sursa i destinaia transferului de date nu suport acelai set de aspecte, transferul de date nu poate avea loc. Aspectele datelor sunt descrise folosind tipurile MIME, adic mecanismul de negociere a coninutului care este folosit de programele de pot electronic sau de World Wide Web. n afar de numele logic al aspectului, acesta mai posed i un nume descriptiv, care poate fi tradus n diferite limbaje internaionale. Aspectele de date pot avea, de asemenea. o clas reprezentativ - de exemplu, dac datele sunt un ir Unicode, acesta este reprezentat de clasa String. Dac aspectul de date nu este reprezentat de nici o clas, va fi folosit implicit clasa InputStream. Pentru a crea un nou aspect de date trebuie creat o instan a clasei DataFlavor folosind unul din urmtorii constructori:

DataFlavor(Class, String) creeaz un aspect de date care reprezint o clas Java. Argumentul String reprezint numele descriptiv al aspectului. Obiectul DataFlavor rezultat va avea tipul MIME application/x-javaserializedobject. DataFlavor (String, String) creeaz un aspect de date care reprezint un tip MIME, unde primul argument este tipul MIME, iar al doilea reprezint numele descriptiv. Clasa care reprezint acest aspect de date va fi InputStream. Dup ce ai obinut acest obiect cu aspectul de date, putei interoga valorile sale sau putei compara tipurile sale MIME cu cele ale altor obiecte aspect de date pentru a negocia modul cum vor fi transferate datele. Aspectele de date sunt folosite de obiectele transferabile, care sunt definite folosind interfaa Transferable. Un obiect transferabil va conine datele ce urmeaz a fi transferate, precum i instane pentru fiecare dintre aspectele de date care reprezint obiectul respectiv. Pentru ca obiectul dumneavoastr transferabil s poat fi ntr-adevr negociat i transferat, trebuie s implementai i metodele getTransferDataFlavors(), isDataFlavorSupported() i getTransferData(). (Pentru detalii, consultai documentaia interfeei Transferable.) Clasa StringSelection implementeaz un obiect transferabil simplu, pentru transferul irurilor de text, folosind obiecte DataFlavor i interfaa Transferable. Reinei c obiectele transferabile sunt folosite pentru ncapsularea datelor i pentru descrierea formatului (aspectului) acestora; ele nu au nici un rol n formatarea datelor, la nici una dintre prile implicate n transfer. Aceasta este responsabilitatea programului dumneavoastr atunci cnd folosii zona Clipboard pentru a obine date de la o surs.

Folosirea zonei Clipboard


Dup ce ai definit obiectul transferabil, putei folosi zona Clipboard pentru a transfera obiectul ntre componente sau ntre Java i platforma nativ. Java 2 ofer un mecanism foarte simplu pentru lucrul cu zona Clipboard, prin care putei copia i accesa informaii n/din aceast zon. Putei folosi fie zona Clipboard standard a sistemului pentru a face schimb de date cu celelalte programe care ruleaz pe platforma nativ, fie propriile instane de zone Clipboard sau mai multe seturi specializate de zone Clipboard. Zonele Clipboard sunt reprezentate n Java de clasa Clipboard, care face parte tot din pachetul java.awt.datatransfer. Putei accesa zona Clipboard a sistemului folosind metodele getToolkit() i getSystemClipboard(); getToolkit () v permite s accesai diferite funcii ale sistemului: Clipboard clip = getToolkit().getSystemClipboard(); Important de remarcat pentru zona Clipboard a sistemului: applet-urile nu au voie s acceseze aceast zon din motive de securitate (aici se pot afla informaii confideniale). Astfel, applet-urile nu pot face schimburi de informaii n nici un sens cu platforma nativ prin intermediul zonei Clipboard. Totui, se pot folosi zone Clipboard interne pentru copierea i lipirea datelor ntre componentele unui applet. Orice component care dorete s foloseasc zona Clipboard - fie s pun date acolo folosind copierea (copy) sau decuparea (cut), fie s preia date folosind lipirea (paste) - trebuie s implementeze interfaa ClipboardOwner. Aceast interfa are o singur metod: lostOwnership(), care este apelat atunci cnd o alt component preia controlul asupra zonei Clipboard. Pentru a implementa operaia de copiere sau decupare (copy sau cut) trebuie parcurse urmtoarele etape: 1. Creai o instan a obiectului Transferable, care s pstreze datele ce urmeaz a fi copiate. 2. Creai o instan a obiectului care implementeaz interfaa ClipboardOwner (care poate fi clasa curent sau chiar obiectul Transferable). 3. Dac folosii zona Clipboard a sistemului, folosii metoda getSystemClipboard() pentru a obine o referin la aceasta.

4. Apelai metoda setContents() a zonei Clipboard, avnd ca argumente obiectul transferabil i obiectul care implementeaz interfaa ClipboardOwner. Folosind aceast metod, obiectul dumneavoastr i-a adjudecat" posesia asupra zonei Clipboard. 5. Metoda lostOwnership() este apelat atunci cnd un alt obiect preia controlul asupra zonei Clipboard. Aceast metod trebuie implementat dac dorii s realizai o anumit aciune la apariia evenimentului (sau putei crea o metod vid atund cnd nu v intereseaz dac cineva a nlocuit coninutul zonei Clipboard). Pentru implementarea unei operaii de lipire (paste) trebuie parcurse urmtoarele etape: 1. Folosii metoda getContents() a clasei Clipboard, care returneaz un obiect transferabil. 2. Folosii metoda getTransferDataFlavors() a obiectului transferabil pentru a afla ce aspecte de date suporta obiectul transferabil. Stabilii ce aspect vei folosi. 3. Accesai datele conform aspectului dorit, folosind metoda getTransferData() a obiectului transferabil. Un astfel de exemplu este prezentat n continuare. import java.awt.*; import java.awt.event.*; import java.awt.datatransfer.*; public class CopyPaste extends Frame implements ActionListener, ClipboardOwner { Button copy, paste; TextField tfCopy, tfPaste; Clipboard clip; public static void main(String[] arguments) { CopyPaste test = new CopyPaste(); WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; test.addWindowListener(l); test.setSize(200, 150); test.show(); } CopyPaste() { super("Copy and Paste"); clip = getToolkit().getSystemClipboard(); FlowLayout flo = new FlowLayout(); setLayout(flo); copy = new Button("Copy From"); tfCopy = new TextField(25); paste = new Button("Paste To"); tfPaste = new TextField(25); copy.addActionListener(this); paste.addActionListener(this); paste.setEnabled(false);

add(copy); add(tfCopy); add(paste); add(tfPaste); } void doCopy() { if (tfCopy.getText() != null) { String txt = tfCopy.getText(); StringSelection trans = new StringSelection(txt); clip.setContents(trans, this); paste.setEnabled(true); } } void doPaste() { Transferable toPaste = clip.getContents(this); if (toPaste != null) { try { String txt = (String)toPaste.getTransferData( DataFlavor.stringFlavor); tfPaste.setText(txt); paste.setEnabled(false); } catch (Exception e) { System.out.println("Error -- " + e.toString()); } } } public void actionPerformed(ActionEvent e) { if (e.getSource() == copy) doCopy(); else if (e.getSource() == paste) doPaste(); } public void lostOwnership(Clipboard clip, Transferable contents) { } }