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.
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.