© 2013 All rights reserved.
4

Java: Minimize to Tray

Občas chceme ve svém programu umožnit uživateli minimalizovat otevřený frame programu tak, aby nebyl vidět ani na liště start. V takovém případě můžeme použít tray, ve kterém si program vytvoří ikonu, přes niž může uživatel k programu přistupovat a popřípadě jej i odsud ovládat.minimize to tray

V příkladu si vytvoříme jednoduchý program, který po spuštění vytvoří tray ikonu. Tato ikona bude obsahovat jednoduché PopUp menu, z něhož bude možno program částečně ovládat.

Navíc bude možné po kliknutí na ikonu program „skrýt do tray“ (pouze nastavení vlastnosti setVisible), což se projeví tak, že program zmizí jak z plochy tak nebude vidět na panelu start v podobě otevřených oken a zůstane pouze identifikační ikona. Navíc bude fungovat klasické minimalizování programu.

Základem bude jednoduchý JFrame, který bude tray ikona reprezentovat. U tohoto framu nastavíme hodnotu Visible na TRUE.

Pro tray ikonu si vytvoříme novou metodu, ve které si teprve uděláme podporu tray ikony. Pro ikonu budeme potřebovat SystemTray, který se nachází v java.awt. Bohužel tato vlastnost nemusí existovat ve všech verzích javy, musíme tedy nejpve zkontrolovat, zda je podporována:

Dále si uděláme jednoduché PopUp menu. Toto menu bude mít jenom dva menuItems, a to pro minimalizování programu nebo maximalizování a pro ukončení programu.
Pro oba MenuItems si uděláme ActionListenery:

Všimněte si, že v Action Listeneru voláme metodu setvisible(), kterou si doděláme později.

Jelikož jsme kontrolovali podporu SystemTray, je jasné že ji musíme použít.
Navíc vytvoříme novou ikonu, která bude representovat ikonu v tray a nový objekt typu TrayIcon, do kterého přidáme jak ikonu tak popup menu:

Zčásti je hotovo. Po spuštění programu a po dopssání metody setvisible(), by se zobrazila tray ikona včetně PopUp menu.

Navíc si program rozšíříme o to, aby se okno programu po kliknutí na ikonu skrylo v případě že je zobrazeno a zobrazilo v případě že je skryté.

To vyřešíme jednoduše přidáním Mouse Listeneru k prvku trayIcon:

Využijeme pouze metody mouseClicked, která mám odchytí kliknutí na ikonu. Navíc kontrolujeme hodnotu arg0.getButton, aby bylo povoleno pouze levé tlačítko myši.
Opět využíváme metodu setvisible(), kterou si nyní napíšeme:

Metoda kontroluje aktuální hodnotu nastavení visible aktuálního prvku a dle aktuálního stavu ji nahradí za hodnotu opačnou.

Nakonec ještě celý kód:

Comments (4)

this. vetsina lidi pouziva z duvodu ze pokud clovek v prostredi napise this a . nabidne to hned mozne operace tzn. urychleni psani kodu :)

Ahoj,
bohužel mi to nejde… nezná to SystemTray a TrayIcon. Jsem naprostý začátečník takže se omlouvám, že nevím jak to řešit ))-: Jinak díky za pěkný článek.
W

Zkus pouzit jinou verzi javy.
Prave pro tento pripad je zde kontrola, zda je SystemTray podporovana:
if( SystemTray.isSupport ed()){
//true
}
e lse
{
//false
}

if (this.isVisible() == true) {
this.setVisible(false);
} else {
this.setVisible(true);
}

Teda to je krásná ukázka "škaredého" kódu (náš učitel Javy by použil silnější slova, případně by dotyčného na místě rovnou zardousil). Takže trochu lépe a přehledněji:

this.setVisible(!this.isVisible());

Lepší, že? (Nehledě na to, že this se dá vypustit).

A ještě poznámka, proměnné typu boolean zásadně netestujeme pomocí ==, protože už samy o sobě vracejí podmínku. Testování pomocí == je prasárna.

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