© 2013 All rights reserved.
4

Java: PopUp Window

Jednoduchý způsob jak vytvořit animované PopUp okno v Javě. Okno se plynule vysune do rohu obrazovky, určený čas počká a zase se plynule schová.

Čas od času může nastat situace, kdy chcete uživateli sdělovat informace o běhu programu, který ale může být v pozadí, nebo minimalizovaný. V takovémto případě není moc platné vypisovat informace do okna programu, ale musíme nají jiný způsob, například uživateli nechat vyskočit PopUp okno, které jej na danou skutečnost upozorní.


java popup widnow

Pro příklad jsem využil dvě třídy, jednu pro vyvolání PopUp okna a druhou pro samotné PopUp okno.

Třída pro vyvolání PopUp okna pouze dědí JFrame, zobrazí okno, ve kterém je jedno tlačítko, které vyvolá pomocí ActionListeneru akci a spustí třídu pro zobrazení PopUp okna.

Pro názornost příkladu jsou nastaveny všechny rozměry a texty ve vyskakovacím oknu napevno.

Po kliknutí na tlačítko se okno zobrazí v pravém horním rohu a to tak, že plynule vyjede z horního okraje obrazovky. Po čas zobrazení zůstane nehybně vyset a poté se opět plynule schová, tentokrát za pravý okraj obrazovky.

Třída TopWindow

Třída TopWindow, jak již bylo zmíněno, je pouze pro názornost a umožňuje vyvolání vyskakovacího okna. Obsahuje jedno jediné tlačítko, které je pomocí ActionListeneru svázáno s metodou RunPopup. Tato metoda vytvoří novou instanci druhé třídy – PopupWindow.

Třída dědí JFrame, jímž je okno zobrazeno:

Třída PopupWindow

Třída PopupWindow obstarává samotné zobrazení PopUp okna.

Obsahuje napevno dané rozměry vyskakovacího okna, jako private proměnné a do třídy nepřecházení žádné parametry.

PopupWindow dědí JWindow, abychom dosáhli pěkného okna bez okrajů a navíc implementuje rozhraní Runnable.

Konstruktor obsahuje vytvoření okna o daných rozměrech, ve kterém vytvoří Container.

Do Containeru je umístěn text, zobrazovaný v okně.

Navíc jsou v konstruktoru zjištěny rozměry plochy pomocí java.awt.Toolkit, abychom mohli okno umístit přesně na dané rozměry.

Pokud by nebylo možné, například kvůli verzi javy, zjistit rozměry plochy, museli bychom okno zobrazit v pravém horním rohu, kde by byly souřadnice nulové.

Na konci konstruktoru je spuštěn nový Thread, který se bude starat o plynulé vysunutí a opětné schování okna:

Nakonec už zůstává pouze metoda Run, která se spouští v důsledku nového Threadu.

Metoda postupně mění pozici okna pomocí setLocation, a s využitím Thread.sleep dosáhne plynulého vysunutí a zasunutí.

Nejprve je okno v cyklu While vysunuto z pravého horního rohu směrem dolů. Na této pozici okno 2 sekundy zůstane a plynule se zasune, s využitím druhého cyklu while, za pravý okraj plochy:

Celý zdrojový kód si můžete prohlídnout zde:

Comments (4)

Další super inspirativní článek, děkuji! ;-)
Určitě přidávej další o Javě, píšeš to moc hezky.

viz 60. a 62. řádek:
Container cont = new Container();
cont = getContentPane();

To si napřed vytvoříš nový container a pak ho vzápětí zrušíš? (Ztráta reference na objekt = zrušení objektu v příštím volání GC).

Nevím jak je tomu u AWT ale u Swingu je důrazně nedoporučeno (zakázáno až na výjimky) měnit obsah GUI z jiného než z EDT vlákna. Takže by změna pozice okna měla vypadat nějak takto:

SwingUtilities.invokeLater( "setLocation()" )

Jej. Já jsem tohle kdysi davno resil prez vyskakovaci okno v JFrame, ale tohle je lepsi.
Vyzkousim.

Add comment

About
Hi, i am programmer from the Czech Republic. I love web development (Ruby, Ruby on Rails, PHP, Nette) and iOS development (Objective-C, Cocoa).
To cooperate, here is my phone:
+420 608 836