Advanced
Java
Services
|
In die Statuszeile des Browsers schreiben |
Es ist sehr simpel, von einem Applet aus die Statuszeile des Browsers anzusprechen. Man ruft
einfach die Methode showStatus() und übergibt ihr einen String. Das folgende kleine Applet
bringt einen Button. Wenn man ihn drückt, erscheint eine Meldung in der Statuszeile.
import java.awt.* ;
import javax.swing.* ;
import java.applet.* ;
import java.awt.event.*;
public class ShowStatus extends Applet implements ActionListener
{
private JButton b ;
private int count=0;
public void init()
{
setBackground( new Color(220,230,240) );
initButton();
}
private void initButton()
{
JButton b = new JButton("drück mich");
b.setBackground( new Color(240,230,220) );
b.addActionListener(this) ;
add(b);
}
public void actionPerformed(ActionEvent e)
{
showStatus("button pressed "+ ++count);
}
} // ende class
Hier kann man es ausprobieren
Vielleicht will man aber keinen Button , vielleicht will man lediglich einmal eine Meldung zu
Beginn des Applets absetzen. Dieses einfache Vorhaben erfordert relativ viel Aufwand. Die Idee
showStatus in init() oder start() zu verwenden, ist leider nicht von Erfolg gekrönt:
import java.awt.* ;
import java.applet.* ;
import java.awt.event.*;
public class NixShowStatus extends Applet
{
private Label label = new Label("Schau mal in die Statuszeile...");
public void init()
{
add(label);
showStatus("init says hello");
}
public void start()
{
showStatus("start says hello");
}
} // ende class
Hier kann man sehen, daß man die Meldungen nicht sieht...
wirkungsloser Aufruf von showStatus() in init() und start()
Der Grund liegt darin, daß der Browser selbst in die Statuszeile schreibt. Sobald die start()-Methode
beendet ist, meldet der Browser "Applet NameDesApplets started". Man muß es also schaffen, nach dem
Ende von start() einen showStatus()-Aufruf abzusetzen. Das geht etwa über einen Thread, der nachschaut,
ob start() schon beendet worden ist.
import java.awt.* ;
import java.applet.* ;
import java.awt.event.*;
public class ShowStatus2 extends Applet implements Runnable
{
boolean startIsRunning = true;
String message;
public void init()
{
setLayout( new BorderLayout() );
Label label = new Label("schau mal in die Statuszeile", Label.CENTER);
label.setBackground( new Color(220,230,240) );
add(label);
}
public void start()
{
showStatusAfterStart("www.straub.as says hello") ;
startIsRunning = false;
}
public void showStatusAfterStart(String msg)
{
message = msg;
Thread showMessage = new Thread(this) ;
showMessage.start();
}
public void run()
{
do
{
Be.idleFor(300);
}
while( startIsRunning ) ;
showStatus(message);
startIsRunning = true;
}
} // end class
Der in init() aufgerufene Methode showStatusAfterStart() wird die Meldung übergeben. Sie gibt diese
Meldung an eine Instanzvariable weiter und startet einen Thread, der das in der Appletklasse
implementierte run() benützt. In run() wird alle 300 Millisekunden der Wert einer booleschen Variablen
überprüft. Am Ende von start() wird startIsRunning auf false gesetzt. Da die Anweisung davor einen
Thread startet ist nicht sichergestellt, daß bei der nächsten Anweisung der Thread schon gestartet ist.
Es könnte also passieren, daß startIsRunning auf false gesetzt und der Thread noch garnicht gestartet
worden ist. Zudem wird startIsRunning noch innerhalb von start() auf false gesetzt, start() selbst
beendet sich aber erst nach diesem Statement. Aus diesem Grund arbeitet run() mit einer do while()
Schleife, um sicherzustellen, daß zumindest einmal 300 Millisekundec gewartet wird. Danach wird
in run() showStatus() aufgerufen und die in der Instanzvariablen hinterlegte Meldung ausgegeben.
Das Beispiel wurde mit IExplorer, Netscape und im AppletViewer getestet.
Die Klasse Be ist eine ebenso simple wie nützliche Einhüllung von Thread.sleep() .
public final class Be
{
private Be() {}
public static void idleFor(int milli)
{
try
{
Thread.sleep(milli);
}
catch(InterruptedException ex)
{
}
} // end idleFor
} // end class
Aufruf von showStatus() nach start()