Advanced   Java   Services
In die Statuszeile des Browsers schreiben
Back Next Up Home

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

ShowStatusApplet

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()

top Back Next Up Home