Spuštění apletu v samostatném okně

Jiří Kosek ml.

Chtěl bych vytvořit aplet v Javě, který by běžel v samostatném okně a nebyl přímo součástí stránky. Je možné tento aplet vytvořit tak, aby jeho životnost enbyla omezena pouze prohlížením stránky, ze které byl vyvolán?

Vytvoření okna, které se tváří samostatně a nezávisle na prohlížeči, není v Javě problém. Stačí vytvořit instanci třídy Frame. Do nově vytvořeného okna můžeme přidávat menu a další dialogové prvky, nebo do něj kreslit přímo předefinováním metody paint().

V praxi bychom si tedy vytvořili novou třídu MojeOkno, která bude založena na třídě Frame. Novou třídu uděláme velice jednoduchou -- bude nám stačit, když do okna vypíše nějaký text.

Vytvoříme tedy konstruktor třídy MojeOkno(). V něm nastavíme jméno okna voláním předka (super). Poté vytvoříme tlačítko s krátkým nápisem a vložíme je do okna.

Abychom mohli naše nově vzniklé okno někdy zavřít, musíme u něj implementovat rozhraní WindowsListener, které slouží jako šablona pro obsluhu událostí okna. Naše třída bude pro zjednodušení reagovat pouze na událost zavření okna. V tomto případě zavolá metodu dispose(), která uvolní naše okno.

V samotném inicializačním kódu apletu stačí vytvořit instanci našeho okna v proměnné frame, nastavit velikost našeho okna a pomocí metody frame.show() okno zobrazit.

Celý aplet SamostatneOkno.java vypadá tedy takto:

import java.awt.*;
import java.applet.*;
import java.awt.event.*;

// Aplet, který zobrazí samostatné okno
public class SamostatneOkno extends Applet {

  // Instance nového okna
  MojeOkno frame;

  // Inicializace apletu
  public void init() {
    frame = new MojeOkno();                // Vytvoření okna
    frame.setSize(new Dimension(400,200)); // Nastavení rozměrů okna
    frame.show();                          // Zobrazení okna
  }
}

// Třída s definicí samostatného okna
class MojeOkno extends Frame {

  Label label1 = new Label();              // Popiska pro zobrazení textu

  // Třída reagující na události vysílané oknem
  private class WindowClose implements WindowListener {
    public void windowOpened     (WindowEvent e) {}
    public void windowClosed     (WindowEvent e) {}
    public void windowIconified  (WindowEvent e) {}
    public void windowDeiconified(WindowEvent e) {}
    public void windowActivated  (WindowEvent e) {}
    public void windowDeactivated(WindowEvent e) {}
    public void windowClosing    (WindowEvent e) {
      dispose();                            // Zavření okna
    }
  }

  // Konstruktor okna
  MojeOkno() {
    super("Moje aplikace jako samostatné okno");  // Nastavení titulku okna
    label1.setFont(new Font("SansSerif", 1, 50)); // Vytvoření popisky
    label1.setText("Moje okno!!!");
    label1.setAlignment(1);
    this.setLayout(new BorderLayout());           // Nastavení layout manageru
    this.add(label1, BorderLayout.CENTER);        // Přidání popisky do okna
    this.addWindowListener(new WindowClose());    // Aktivace obsluhy událostí

  }

}
Po přeložení získáme soubor SamostatneOkno.class, který již můžeme zařadit do stránky jako aplet. My však nechceme, aby byl přímo v prohlížeči nějaký aplet vidět. To můžeme snadno obejít tím, že u apletu nastavíme nulové rozměry a přesuneme ho na pravý okraj obrazovky, kde si ho nikdo nemůže všimnout:
<HTML>
<HEAD>
<TITLE>Ukázka stránky, která vytvoří samostatné okno v Javě</TITLE>
</HEAD>
<BODY>
<H1>Stránka, ve které na první pohled není aplet</H1>

<APPLET CODE="SamostatneOkno.class" 
	WIDTH=0 HEIGHT=0 HSPACE=0 VSPACE=0 ALIGN=RIGHT></APPLET>

Apletu si nejspíš nikdo ani nevšimne.

</BODY>
</HTML>
Výsledek našeho snažení si můžeme prohlédnout na obrázku.
Obr.: Samostatné javové okno vyvolané z apletu
Samostatné javové okno vyvolané z apletu

Takto vytvořené okno zůstane otevřené i po přechodu na jinou stránku. Pokud bychom chtěli okno automaticky zavřít při změně stránky, museli bychom ve třídě SamostatneOkno definovat metodu destroy(), která uvolní okno pomocí frame.dispose().

Okno se samozřejmě zavře po uzavření prohlížeče, protože ten oknu poskytuje interpret Javy.

© Jiří Kosek 1999