Bezoek de testpagina om over een up-to-date versie van de Java Runtime Environment te beschikken.
Anders kan u problemen ondervinden bij het bekijken van de voorbeelden.
In de voorbeelden in de hoofdstuk gebruik ik enkel de tag Applet om Java-Applets in te voegen, er zijn echter zoals je verderop zal lezen andere manieren om dit te doen. Ik heb echter de voorbeeldcode bewust zo eenvoudig mogelijk gehouden, gelieve dus eerst deze testpagina te openen om te controleren of de juiste Java-plugin bij u is geïnstalleerd.
Controle uitgevoerd op minimaal versie 1.4 van de JRE, controlecode gegenereerd door Sun's HTMLConverter (zie verderop).
In dit hoofdstuk zullen we Applets van naderbij bestuderen. In de eerste hoofdstukken van de cursus heb je reeds kennis gemaakt met Applets. We maakten reeds een aantal eenvoudige Applets om de basisprincipes van Java te demonstreren. Nu leer je hoe je met Applets kan interageren met de webpagina, en zal je ook zien dat bij het gebruik van Applets de mogelijkheden van Java nauwer begrensd worden.
De klasse Applet maakt deel uit van het pakket java.applet en erft over van de klasse java.awt.Panel
Daar wij de GUI-Swing componenten hebben besproken zullen we in dit hoofdstuk gebruik maken van Applets die Swing-componenten ondersteunen. Deze Applets erven over van de klasse javax.swing.JApplet.
Een subklasse van Applet of JApplet ondersteund standaard volgende methoden:
| methode | omschrijving |
|---|---|
| init | Geladen bij het inistialiseren van de Applet: instructies om de Applet op te bouwen. |
| start | Instructies die uitgevoerd worden wanneer de Applet geladen is: start van de uitvoering van de Applet |
| stop | Wanneer het uitvoeren van de Applet wordt gestopt, bijvoorbeed wanneer de gebruiker een andere pagina bezoekt, of de browser sluit |
| destroy | Opruimen vooraleer de Applet niet meer geladen is |
| paint | Het tekenen van de Applet. Deze methode wordt door bepaalde gebruikersacties (zoals veranderen van het vensterformaat) of door de methode repaint opnieuw uitgevoerd. |
Uit onderstaand voorbeeld kan je afleiden dat init gebeurt voor start.
We gebruiken een StringBuffer met de naam buffer om een tekenreeks te bewaren. Een StringBuffer ondersteund de handige methode append om tekens aan de StringBuffer toe te voegen.
In de methode nieuwItem tonen we de tekenreeks die we toevoegen in de console, voegen we de tekenreeks toe aan buffer en voeren we repaint uit, waardoor de methode paint opnieuw wordt uitgevoerd.
In de methode paint tekenen we een rand omheen de Applet en brengen we de inhoud van buffer op het scherm in de Applet.
We zorgen ervoor dat in de methoden init en start telkens een waarde wordt toegevoegd aan buffer.
import java.awt.*;
public class A1 extends javax.swing.JApplet {
StringBuffer buffer;
public void init() {
buffer = new StringBuffer();
nieuwItem("init...");
}
public void start(){
nieuwItem("start...");
}
public void paint(Graphics g){
//rand omheen de toepassing
g.drawRect(0, 0, size().width - 1, size().height - 1);
//inhoud van de StringBuffer op het scherm
g.drawString(buffer.toString(), 5, 15);
}
private void nieuwItem(String nieuw){
System.out.println(nieuw);
buffer.append(nieuw);
repaint();
}
private void initComponents() {
}
// Variables declaration - do not modify
// End of variables declaration
}
Hier kan je gerust met een subklasse van Applet werken in plaats van JApplet, we gebruiken nog geen Swing-componenten.
Het toevoegen van Graphical User Interface (GUI) - componenten aan een Applet gebeurt standaard in de methode init.
De methode paint is niet meer nodig daar de GUI-componenten zichzelf tekenen.
Wanneer je de methode paint toch implementeert zullen de GUI-componenten niet meer getoond worden !
public class A2 extends javax.swing.JApplet {
public void init() {
initComponents();
lst.addItem("Zeer leuk");
lst.addItem("Leuk");
lst.addItem("Niet leuk");
}
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jPanel3 = new javax.swing.JPanel();
lst = new javax.swing.JComboBox();
jPanel2 = new javax.swing.JPanel();
lblRes = new javax.swing.JLabel();
getContentPane().setLayout(new javax.swing.BoxLayout(getContentPane(), javax.swing.BoxLayout.Y_AXIS));
jPanel1.setLayout(new java.awt.GridLayout(1, 2));
jPanel1.setBorder(new javax.swing.border.EmptyBorder(new java.awt.Insets(20, 20, 20, 20)));
jLabel1.setText("Werken met Applets is:");
jPanel1.add(jLabel1);
lst.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
lstActionPerformed(evt);
}
});
jPanel3.add(lst);
jPanel1.add(jPanel3);
getContentPane().add(jPanel1);
jPanel2.setBackground(new java.awt.Color(204, 255, 204));
jPanel2.setBorder(new javax.swing.border.TitledBorder(""));
jPanel2.add(lblRes);
getContentPane().add(jPanel2);
}
private void lstActionPerformed(java.awt.event.ActionEvent evt) {
lblRes.setText(lst.getSelectedItem().toString());
}
// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JLabel lblRes;
private javax.swing.JComboBox lst;
// End of variables declaration
}
Om Applets uit te voeren in een browser moet de computer van de gebruiker beschikken over de Java Virtual Machine. De JVM wordt geïnstalleerd wanneer je de Java Runtime Environment (JRE) installeert.
Laatste versie van de JRE ophalen
Om een Applet te bekijken kan je werken met de appletviewer van Sun, of met een webbrowser die Java-Applets ondersteund.
Om een Applet te tonen op een webpagina kan je de tag Applet in de HTML-code van de pagina invoegen. In het attribuut code geef je de naam van het .class-bestand op dat je wenst te gebruiken. Bestaat je toepassing uit meerdere .class-bestanden, dan geef je de naam op van de hoofdklasse (de klasse met de methode init). Later zal je leren hoe je ook met .jar-bestanden kan werken.
De attributen width en height staan toe de afmetingen van de Applet op de webpagina te bepalen.
<APPLET code="tekstapplet.class" width="350" height="200"> Uw browser ondersteunt de Applet-tag niet </APPLET>
Je kan de tag Applet niet gebruiken om automatisch een update van de JRE uit te voeren.
De tag Object met het attribuut classid en eventueel codebase is bestemd voor gebruikers van Internet Explorer.
<OBJECT
classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
codebase="http://java.sun.com/products/plugin/autodl/
jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"
width="200" height="200">
<PARAM name="code" value="Applet1.class">
</OBJECT>
In het attribuut classid kan je definiëren welke versie van de Java plugin je wenst te gebruiken.
Specifiëren welke versie er moet worden gebruikt:
Vb. Java 1.5.0 : classid="clsid:CAFEEFAC-0015-0000-0000-ABCDEFFEDCBA"
Met het attribuut codebase kan je opgeven waar de benodigde versie van de JRE kan worden gedownload.
Hier vind je een Lijst met de JRE-versies en de gekoppelde URL's.
Voor Mozilla browser wordt de tag embed gebruikt met het attribuut type en pluginspage.
<embed code="Applet1.class" width="200" height="200" type="application/x-java-applet;version=1.5.0" pluginspage="http://java.sun.com/j2se/1.5.0/download.html"/>
<object
classid="clsid:CAFEEFAC-0015-0000-0000-ABCDEFFEDCBA"
<param name="code" value="Applet1.class">
<comment>
<embed code="Applet1.class"
type="application/x-java-applet;jpi-version=1.5.0">
<noembed>
No Java Support.
</noembed>
</embed>
</comment>
</object>
IE ondersteunt de tag object, negeert comment binnen de tag object.
Mozilla negeert de tag object met attribuut classid, interpreteert de inhoud van de tag comment.
Na installatie van Java SDK op Windows staat in de bin-map (vb. C:\jdk1.5.0\bin) het programma HTMLConverter.exe. Met dit programma kan je een HTML-file met een Applet-tag een automatische inhoud voor cross-browser ondersteuning laten genereren.
De code bevat voor browsercontrole enkele Javascript-instructies.
Meer over de tags.
Vanuit een Java-applet kan je documenten laten weergeven door de webbrowser.
Hiervoor gebruik je de methode showDocument van het object AppletContext. De AppletContext van een Applet kan je bereiken via de methode getAppletContext van de Applet.
De methode showDocument ontvangt 1 of 2 argumenten. Het eerste argument is de URL van de te openen webpagina, deze URL is een object van de klasse java.net.URL. Het tweede argument is een String met hierin de naam van het doelvenster:
| Argumentwaarde | Beschrijving |
|---|---|
| _blank | Document opent in een nieuw venster |
| _self | Document opent in het venster waarin de applet geladen is |
| _parent | Document opent in het parent-frame, indien die niet aanwezig is, is dit hetzelfde als _self |
| _top | Document opent in het hoofdvenster |
| vensternaam | Document opent in het venster met de aangegeven naam |
Applet met een keuzelijst, de gebruiker kan in de lijst een site aanduiden. Door een druk op een opdrachtknop wordt de gekoppelde site getoond in een toepassingsframe.
Bekijk de voorbeeldtoepassing:
A3.java import java.net.*; import javax.swing.*; public class A3 extends javax.swing.JApplet { String links[] = {"IVO","SUN","Loempia"}; URL urls[] = { maakURL("http://www.ivobrugge.be"), maakURL("http://java.sun.com"), maakURL("http://www.loempia.be") }; public URL maakURL(String str){ URL url = null; try { url = new URL(str); } catch (MalformedURLException e) {} return url; } public void init() { initComponents(); } private void initComponents() { jPanel1 = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); lst = new JList(links); cmdSurf = new javax.swing.JButton(); jPanel1.setLayout(new javax.swing.BoxLayout(jPanel1, javax.swing.BoxLayout.Y_AXIS)); jScrollPane1.setAlignmentX(0.0F); lst.setAlignmentX(0.0F); jScrollPane1.setViewportView(lst); jPanel1.add(jScrollPane1); cmdSurf.setText("Surf !"); cmdSurf.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cmdSurfActionPerformed(evt); } }); jPanel1.add(cmdSurf); getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER); } private void cmdSurfActionPerformed(java.awt.event.ActionEvent evt) { getAppletContext().showDocument(urls[lst.getSelectedIndex()], "inhoud"); } // Variables declaration - do not modify private javax.swing.JButton cmdSurf; private javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JList lst; // End of variables declaration } A3index.html <html> <head> <title>A3Index</title> </head> <frameset cols="200,*"> <frame src="A3.html"> <frame src="p1.html" name="inhoud"> </frameset </html> A3.html <HTML> <HEAD> <TITLE>Applet HTML Page</TITLE> </HEAD> <BODY> <P> <APPLET code="A3.class" width=150 height=200></APPLET> </P> </BODY> </HTML> p1.html <html> <head> <title>Untitled</title> </head> <body> Pagina1 </body> </html>
Vanuit een JApplet kan je een JFrame openen, dit venster kan je als Java-popup gebruiken. Je kan natuurlijk ook werken met JOptionPane of JDialog.
We maken een toepassing waar de gebruiker in een tekstvak een naam van een werknemer kan ingeven. Door op een knop te drukken verschijnt in een popup-venster een lijst met werknemers. Door een item uit de lijst te kiezen wordt de lijst gesloten en wordt de naam getoond in het tekstvak.
We maken hier een toepassing bestaande uit twee klassen:
Om de werknemerlijst te tonen maken we een instantie aan van Fwerknemer en gebruiken we de methode setVisible(true) om het venster te tonen.
Om de lijst te verbergen gebruiken we de methode setVisible(false), om dit venster te vernietigen gebruiken we de methode dispose.
Deze toepassing bestaat uit meerdere klassen, in de html-code hoeven we in de Applet-tag enkel de naam van het initiële class-bestand op te geven (A4.class).
We zorgen ervoor dat de JList lstwerknemers in de popup public gedeclareerd is. In de hoofdklasse A4 voegen we een ListSelectionListener toe aan de keuzelijst van de klasse Fwerknemer. Hierdoor kunnen we het tekstvak txtNaam uit de klasse A4 blijven benaderen.
Fwerknemer.java import java.applet.*; import javax.swing.*; public class Fwerknemer extends javax.swing.JFrame { String werknemers[] = {"Arends Tony","Bellemans Jeannine","Vandersmissen Eddy","Wouters Tina" }; public Fwerknemer() { initComponents(); } private void initComponents() { jPanel1 = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); lstWerknemers = new JList(werknemers); setTitle("Keuze"); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { formWindowClosing(evt); } }); jScrollPane1.setViewportView(lstWerknemers); jPanel1.add(jScrollPane1); getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER); pack(); } private void formWindowClosing(java.awt.event.WindowEvent evt) { setVisible(false); dispose(); } // Variables declaration - do not modify private javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane1; public javax.swing.JList lstWerknemers; // End of variables declaration } A4.java import javax.swing.event.*; public class A4 extends javax.swing.JApplet { Fwerknemer FrmWerknemer = new Fwerknemer(); public void init() { initComponents(); } private void initComponents() { jPanel1 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); txtNaam = new javax.swing.JTextField(); cmdOpzoeken = new javax.swing.JButton(); getContentPane().setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT, 0, 0)); setBackground(new java.awt.Color(204, 204, 255)); jPanel1.setBackground(new java.awt.Color(204, 204, 255)); jPanel1.setBorder(new javax.swing.border.CompoundBorder(new javax.swing.border.TitledBorder("Kies een werknemer"), new javax.swing.border.EmptyBorder(new java.awt.Insets(10, 10, 10, 10)))); jLabel1.setText("Naam werknemer:"); jPanel1.add(jLabel1); txtNaam.setPreferredSize(new java.awt.Dimension(150, 21)); jPanel1.add(txtNaam); cmdOpzoeken.setText("..."); cmdOpzoeken.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cmdOpzoekenActionPerformed(evt); } }); jPanel1.add(cmdOpzoeken); getContentPane().add(jPanel1); } private void cmdOpzoekenActionPerformed(java.awt.event.ActionEvent evt) { FrmWerknemer.lstWerknemers.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent evt) { txtNaam.setText(FrmWerknemer.lstWerknemers.getSelectedValue().toString()); FrmWerknemer.setVisible(false); } }); FrmWerknemer.pack(); FrmWerknemer.setVisible(true); } // Variables declaration - do not modify private javax.swing.JButton cmdOpzoeken; private javax.swing.JLabel jLabel1; private javax.swing.JPanel jPanel1; private javax.swing.JTextField txtNaam; // End of variables declaration } A4.html <HTML> <HEAD> <TITLE>Applet HTML Page</TITLE> </HEAD> <BODY bgcolor="#ccccff"> <h2>Applet: gebruik van een JFrame-popup</h2> <P> <APPLET code="A4.class" width=348 height=80></APPLET> </P> </BODY> </HTML>
Bij het initiëren van de klasse Fwerknemer geven we vanuit de klasse A4 (de hoofdklasse) een referentie naar het in te vullen tekstvak txtNaam mee.
Hierdoor kunnen we eenvoudig het manipuleren van de keuzelijst afhandelen in de klasse Fwerknemer.
Fwerknemer.java import java.applet.*; import javax.swing.*; public class Fwerknemer extends javax.swing.JFrame { String werknemers[] = {"Arends Tony","Bellemans Jeannine","Vandersmissen Eddy","Wouters Tina" }; JTextField doelvak; public Fwerknemer(JTextField tekstvak) { initComponents(); doelvak = tekstvak; } private void initComponents() { jPanel1 = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); lstWerknemers = new JList(werknemers); setTitle("Keuze"); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { formWindowClosing(evt); } }); lstWerknemers.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { lstWerknemersValueChanged(evt); } }); jScrollPane1.setViewportView(lstWerknemers); jPanel1.add(jScrollPane1); getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER); pack(); } private void lstWerknemersValueChanged(javax.swing.event.ListSelectionEvent evt) { doelvak.setText(lstWerknemers.getSelectedValue().toString()); setVisible(false); dispose(); } private void formWindowClosing(java.awt.event.WindowEvent evt) { } // Variables declaration - do not modify private javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JList lstWerknemers; // End of variables declaration } A4.java import javax.swing.event.*; public class A4 extends javax.swing.JApplet { public void init() { initComponents(); } private void initComponents() { jPanel1 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); txtNaam = new javax.swing.JTextField(); cmdOpzoeken = new javax.swing.JButton(); getContentPane().setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT, 0, 0)); setBackground(new java.awt.Color(204, 204, 255)); jPanel1.setBackground(new java.awt.Color(204, 204, 255)); jPanel1.setBorder(new javax.swing.border.CompoundBorder(new javax.swing.border.TitledBorder("Kies een werknemer"), new javax.swing.border.EmptyBorder(new java.awt.Insets(10, 10, 10, 10)))); jLabel1.setText("Naam werknemer:"); jPanel1.add(jLabel1); txtNaam.setPreferredSize(new java.awt.Dimension(150, 21)); jPanel1.add(txtNaam); cmdOpzoeken.setText("..."); cmdOpzoeken.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cmdOpzoekenActionPerformed(evt); } }); jPanel1.add(cmdOpzoeken); getContentPane().add(jPanel1); } private void cmdOpzoekenActionPerformed(java.awt.event.ActionEvent evt) { Fwerknemer FrmWerknemer = new Fwerknemer(txtNaam); FrmWerknemer.pack(); FrmWerknemer.setVisible(true); } // Variables declaration - do not modify private javax.swing.JButton cmdOpzoeken; private javax.swing.JLabel jLabel1; private javax.swing.JPanel jPanel1; private javax.swing.JTextField txtNaam; // End of variables declaration } A4.html identiek als bij de eerst manier.
Soms is het interessant om vanuit een webpagina argumenten door te geven aan een Applet. Op deze manier kan je Applets maken die configureerbaar zijn.
<APPLET code="Param1.class" width=250 height=30>
<param name="tekst" value="Tekst vanuit HTML-argument">
</APPLET>
De methode getParameter uit de klasse Applet (overgeërfd door JApplet) stelt je in staat parameters te lezen. Deze parametes worden als String ingelezen, je zal in de Java-toepassing de nodige typecasting moeten uitvoeren wanneer je de parameter voor andere doeleinden wenst te gebruiken.
Wanneer de HTML-pagina de parameter waarnaar wordt gezocht niet bevat, dan retourneert getParameter de waarde null.
String tekst = getParameter("tekst");
In deze toepassing kan je een tekenreeks op het scherm brengen, de tekenreeks wordt aangegeven met behulp van een parameter. De gebruiker kan ook de achtergrondkleur en de voorgrondkleur met behulp van parameters instellen.
Het inlezen van de tekenreeks schept niet veel problemen daar deze waarde ingelezen wordt als String en ook als String wordt gebruikt.
Het inlezen van de kleuren zorgt voor wat extra code:
Bekijk de voorbeeldtoepassing:
Param1.html <HTML> <HEAD> <TITLE>Applet HTML Page</TITLE> </HEAD> <BODY> <H3><HR WIDTH="100%">Applet HTML Page<HR WIDTH="100%"></H3> <P> <APPLET code="Param1.class" width=250 height=30> <param name="tekst" value="Tekst vanuit HTML-argument"> <param name="bgc" value="255,255,153"> <param name="fgc" value="153,0,0"> </APPLET> </P> <HR WIDTH="100%"><FONT SIZE=-1><I>Generated by NetBeans IDE</I></FONT> </BODY> </HTML> Param1.java import java.awt.*; public class Param1 extends javax.swing.JApplet { public void init() { initComponents(); jPanel1.setBackground(Color.WHITE); String tekst = getParameter("tekst"); if(tekst != null){ lblBoodschap.setText(tekst); } String bgkleur = getParameter("bgc"); try{ jPanel1.setBackground(maakKleur(bgkleur)); } catch (Exception e){ jPanel1.setBackground(Color.WHITE); } String fgkleur = getParameter("fgc"); try{ lblBoodschap.setForeground(maakKleur(fgkleur)); }catch(Exception e){ jPanel1.setForeground(Color.BLACK); } } public Color maakKleur(String kleur){ Color Nkleur = null; String rgb[] = kleur.split(","); if(rgb.length >= 3){ Nkleur = new Color(Integer.parseInt(rgb[0]),Integer.parseInt(rgb[1]),Integer.parseInt(rgb[2])); } return Nkleur; } private void initComponents() { jPanel1 = new javax.swing.JPanel(); lblBoodschap = new javax.swing.JLabel(); jPanel1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT)); lblBoodschap.setText("Starttekst"); jPanel1.add(lblBoodschap); getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER); } // Variables declaration - do not modify private javax.swing.JPanel jPanel1; private javax.swing.JLabel lblBoodschap; // End of variables declaration }
Het is mogelijk vanuit een webpagina met behulp van Javascript Java-methoden in de Applet uit te voeren.
Omgekeerd is het ook mogelijk Javascript-opdrachten op de webpagina uit te voeren vanuit de Java-Applet.
Opgepast bij het werken met een browser: vaak worden Applets uit de cache geladen. Veelal moet je na een verandering in de Applet de tijdelijke internetbestanden verwijderen en de browser opnieuw starten.
Om dit mogelijk te maken gebruiken we een principt genoemd LiveConnect. Dit houdt concreet in dat we een attribuut mayscript met waarde mayscript toevoegen aan de tag Applet in de HTML-code van de webpagina.
<APPLET code="FJavascript.class" mayscript="mayscript"
width="350" height="200"></APPLET>
De eenvoudigste communicatie is deze in de richting: Javascript naar Java.
Om te communiceren met een Applet geef je deze Applet in de HTML-tag een naam (met het attribuut name of id of beide):
<APPLET code="A5.class" name="testApplet" id="testApplet" width="250" height="100" mayscript="mayscript"></APPLET>
Vanuit Javascript kan je methoden van deze Applet uitvoeren door eerst een geldige referentie te leggen naar dit object. Dit kan je in de meeste browsers doen met de Javascript-functie getElementById.
Voorbeeld:
In dit voorbeeld passen we de tekst weergegeven in een Java-Applet aan met behulp van Javascript.
A5.java public class A5 extends javax.swing.JApplet { public void init() { initComponents(); } public void zetTekst(String tekst){ lblTekst.setText(tekst); } private void initComponents() { jPanel1 = new javax.swing.JPanel(); lblTekst = new javax.swing.JLabel(); jPanel1.setBackground(new java.awt.Color(204, 255, 204)); jPanel1.setBorder(new javax.swing.border.CompoundBorder(new javax.swing.border.TitledBorder("Javascript - Java"), new javax.swing.border.EmptyBorder(new java.awt.Insets(10, 10, 10, 10)))); lblTekst.setText("Welkom op deze Java-Applet"); jPanel1.add(lblTekst); getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER); } // Variables declaration - do not modify private javax.swing.JPanel jPanel1; private javax.swing.JLabel lblTekst; // End of variables declaration } A5.html <HTML> <HEAD> <TITLE>Communicatie Javascript - Java</TITLE> <script type="text/javascript"> function veranderAppletTekst(nieuwetekst){ var App = document.getElementById("testApplet"); App.zetTekst(nieuwetekst); } </script> </HEAD> <BODY> <h2>Communicatie Javascript - Java</h2> <h3>De Java-Applet<h3> <APPLET code="A5.class" name="testApplet" id="testApplet" width="250" height="100" mayscript="mayscript"></APPLET> <h3>HTML-formulierelement met Javascript-actie<h3> <input type="button" value="Verander Applettekst" onclick="veranderAppletTekst('Tekst aangepast vanuit Javascript')"> </BODY> </HTML>
Vanuit Java kan je Javascript-methoden toepassen of zelfs rechtstreeks Javascript opdrachten uitvoeren op de webpagina.
Deze functionaliteit werd ontworpen voor Netscape maar wordt nu door de meeste recente browsers ondersteund.
Vanuit Java kunnen we de webpagina benaderen met een bibliotheek die niet standaard in Java aanwezig is. Deze bibliotheek is afkomstig van Netscape.
Download het java-pakket: netscape.jar.
Als je een toepassing maakt zal je een verwijzing naar dit java-pakket moeten opnemen in de systeemvariabele CLASSPATH. Werk je met NetBeans IDE, dan kan je via rechtklik op filesystems kiezen voor mount > archive files, duidt netscape.jar aan. Nu krijgen we geen compileerfouten bij het maken van de toepassing.
Moderne browsers beschikken standaard over deze functionaliteiten, je hoeft het pakket dus niet mee te distribueren met je toepassing.
Het attribuut mayscript is niet noodzakelijk in bijvoorbeeld Internet Explorer, in Mozilla Firefox echter wel, dus beter dit attribuut ook voorzien in de tag Applet.
Een verwijzing naar de webpagina maak je in Java met een object van de klasse JSObject.
Een JSObject heeft een aantal methoden om de webpagina te manipuleren:
| Methode | Beschrijving |
|---|---|
| getWindow(Applet a) |
Legt een referentie naar het venster dat de Applet bevat
In een Applet wordt dit gewoonlijk:
JSObject win = JSObject.getWindow(this); |
| call(String methodName, Object args[]) | Voert een Javascript-methode uit met opgegeven parameterlijst |
| eval(String s) | Voert een javascript-opdracht uit |
| getMember(String name) | Legt een referentie naar een element van de webpagina, equivalent met this.name in Javascript
voorbeeld:
JSObject doc = (JSObject) win.getMember("document");
JSObject loc = (JSObject) doc.getMember("location");
|
| setMember(String name, Object value) | Stelt een element in op een opgegeven waarde |
| getSlot(int index) | Legt een referentie naar een javascript Array-element, equivalent met this[index] in Javascript. |
| setSlot(int index, Object value) | Stelt de waarde in van een javascript Array-element |
| removeMember(String name) | Verwijdert een lid van een Javascript-object |
Voorbeeld:
In een Java-Applet kan de gebruiker een tekst ingeven in een JTextField txtBericht.
Met behulp van een opdrachtknop kan de Javascript-functie toonBericht worden uitgevoerd, waardoor de inhoud van het tekstvak in een Javascript-alert wordt getoond.
Een tweede opdrachtknop stelt je in staat de inhoud van het tekstvak weer te geven in een HTML-divisie.
A6.java import netscape.javascript.*; public class A6 extends javax.swing.JApplet { public void init() { initComponents(); } private void initComponents() { jPanel1 = new javax.swing.JPanel(); jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); jPanel2 = new javax.swing.JPanel(); txtInvoer = new javax.swing.JTextField(); jPanel1.setLayout(new java.awt.BorderLayout()); jPanel1.setBackground(new java.awt.Color(255, 204, 204)); jButton1.setText("Bericht in divisie"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); jPanel1.add(jButton1, java.awt.BorderLayout.EAST); jButton2.setText("Bericht in Javascript alert"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } }); jPanel1.add(jButton2, java.awt.BorderLayout.WEST); jPanel2.setBackground(new java.awt.Color(255, 204, 204)); jPanel2.setBorder(new javax.swing.border.CompoundBorder(new javax.swing.border.TitledBorder("Geef een bericht in"), new javax.swing.border.EmptyBorder(new java.awt.Insets(10, 10, 10, 10)))); txtInvoer.setText("Tik hier een bericht in"); jPanel2.add(txtInvoer); jPanel1.add(jPanel2, java.awt.BorderLayout.NORTH); getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { JSObject win = JSObject.getWindow(this); win.eval("document.getElementById('divbericht').innerHTML='" +txtInvoer.getText() +"';"); } private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { JSObject win = JSObject.getWindow(this); Object args[] = { txtInvoer.getText() }; win.call("toonBericht" , args); } // Variables declaration - do not modify private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JTextField txtInvoer; // End of variables declaration } A6.html <HTML> <HEAD> <TITLE>Interactie Java - Javascript</TITLE> <style type="text/css"> .test { width:200px; height:50px; border:solid 1px; background-color:#CCCCFF; } </style> <script type="text/javascript"> function toonBericht(bericht){ alert(bericht); } </script> </HEAD> <BODY> <H2>Interactie Java - Javascript</H2> <h3>De Java-Applet:</h3> <P> <APPLET code="A6.class" width="350" height="100" mayscript="mayscript"></APPLET> </P> <h3>Een html-divisie:</h3> <div class="test" id="divbericht">Tekst vanuit html-pagina</div> </BODY> </HTML>
Meer bij Sun
Meer over JSObject (en JSException en Nescape.plugin.plugin)
Wanneer je meerdere Applets op een webpagina gebruikt kan je deze laten communiceren met elkaar.
In NetBeans IDE maak je hiervoor een project met twee JApplet-forms. Door te werken in 1 project krijg je geen foutmeldingen bij verwijzingen tussen de Applets.
Bij het uitvoeren van elk van deze Applets maakt NetBeans IDE echter automatisch een HTML-pagina voor elk van deze Applets. Een van de pagina's heb je niet nodig, voeg een tweede Applet-tag toe aan de pagina voor de eerste Applet.
De methode getApplet van de klasse AppletContext stelt je in staat een referentie naar een andere Applet op te bouwen (de methode getApplets retourneert een lijst met alle applets op een pagina).
De communicatie tussen twee Applets kan gemakkelijkst ingezien worden aan de hand van een voorbeeld:
Hier stuurt de Applet met naam zender een tekstbericht naar de Applet met naam ontvanger. Deze Applets zijn in Java gecompileerd in respectievelijk A7.class en A8.class.
A7.java import java.applet.*; import javax.swing.*; public class A7 extends javax.swing.JApplet { public void init() { initComponents(); } private void initComponents() { jPanel1 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); txtBericht = new javax.swing.JTextField(); jPanel1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT)); jPanel1.setBackground(new java.awt.Color(204, 255, 204)); jPanel1.setBorder(new javax.swing.border.CompoundBorder(new javax.swing.border.TitledBorder("Verstuur een bericht naar A8"), new javax.swing.border.EmptyBorder(new java.awt.Insets(10, 10, 10, 10)))); jLabel1.setText("Stuur bericht naar A8: "); jPanel1.add(jLabel1); txtBericht.setText("Tik hier je bericht"); txtBericht.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtBerichtActionPerformed(evt); } }); jPanel1.add(txtBericht); getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER); } private void txtBerichtActionPerformed(java.awt.event.ActionEvent evt) { Applet ontvanger = null; String ontvangerNaam = "ontvanger"; // Een referentie naar de ontvanger Applet ontvanger = getAppletContext().getApplet(ontvangerNaam); // naam van de zender-Applet String zenderNaam = getParameter("name"); // typecasten naar klasse van ontvanger om de methode van de ontvanger-klasse te kunnen gebruiken ((A8)ontvanger).ontvangBericht(zenderNaam,txtBericht.getText()); } // Variables declaration - do not modify private javax.swing.JLabel jLabel1; private javax.swing.JPanel jPanel1; private javax.swing.JTextField txtBericht; // End of variables declaration } A8.java import java.applet.*; public class A8 extends javax.swing.JApplet { public void init() { initComponents(); } public void ontvangBericht(String zender,String bericht){ lblBericht.setText("Bericht onvangen van " +zender +": " +bericht); } private void initComponents() { jPanel1 = new javax.swing.JPanel(); lblBericht = new javax.swing.JLabel(); jPanel1.setBackground(new java.awt.Color(255, 204, 204)); jPanel1.setBorder(new javax.swing.border.TitledBorder("Ontvang bericht")); lblBericht.setText("Nog geen bericht ontvangen"); jPanel1.add(lblBericht); getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER); } // Variables declaration - do not modify private javax.swing.JPanel jPanel1; private javax.swing.JLabel lblBericht; // End of variables declaration } A7.html <HTML> <HEAD> <TITLE>Applet HTML Page</TITLE> </HEAD> <BODY> <h2>Communicatie tussen Applets</h2> <h3>Zender-Applet</h3> <P> <APPLET code="A7.class" width="350" height="100" name="zender"></APPLET> </P> <h3>Ontvanger-Applet</h3> <P> <APPLET code="A8.class" width="350" height="100" name="ontvanger"></APPLET> </P> </BODY> </HTML>
| Meer tutorials: |
| leer ook: | html | | xhtml | | css | | asp | | asp.net | | c# | | ado.net | | linq | | ajax | | java | | javascript |