Naučte se Javu – grafické uživatelské rozhraní 2.
V předchozím článku jsme se seznámili se základními charakteristikami uživatelského rozhraní AWT. V tomto závěrečném článku našeho seriálu si ukážeme další možnosti jeho využití. Podíváme se na ošetřování událostí a vytvoříme si obecný dialogový box, který budeme moci využívat v různých dalších programech.
Zpracování událostí
Mechanismus událostí slouží k interakci programu s uživatelem a operačním systémem. Událost nastává například při stisku tlačítka, pohybu myši, změně pozice v seznamu, pokusu o zavření okna a podobně. K reakci na události slouží rozhraní EventListener
. Existuje několik rozhraní, které jsou potomky třídy java.util.EventListener
a slouží pro obsluhu různých typů událostí, například:
ActionListener
– zpracovává např. stisk tlačítkaItemListener
– zpracovává změnu položek (seznamů apod.)MouseListener
– zpracovává události myši...
Pokud má program reagovat na danou událost, musí být vytvořena třída implementující dané rozhraní a ta musí být zaregistrována u patřičného prvku (to se provádí metodami addActionListener()
, addItemListener()
a dalšími). Běžně používaný způsob je vytvoření anonymní třídy přímo v registrační metodě, jak ukazuje následující příklad:
java.awt.Button tlacitko = new java.awt.Button();
tlacitko.addActionListener( new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e)
{
// zpracování stisku tlačítka;
}
} );
Tato konstrukce se může zdát na první pohled neprůhledná, ovšem není to až tak složité – parametrem metody addActionListener
je celý konstruktor nepojmenované třídy včetně její implementace, která představuje implementaci metody actionPerformed
. Pokud je zpracování události složitější, napíše se většinou její obsluha v samostatné metodě, která se z ActionListeneru
pouze volá (jinak by byl kód velice nečitelný).
Na jeden typ události jedné komponenty může reagovat více ActionListenerů a jedna komponenta může vyvolávat události více typů. Například java.awt.List
při změně položky v seznamu vyvolává událost pro ItemListener
a při dvojitém poklepání na položce seznamu vyvolá událost pro ActionListener
.
Další příklad ukazuje pro srovnání implementaci ItemListeneru u seznamu:
java.awt.List seznam = new java.awt.List();
seznam.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
// zpracování události posunu v seznamu
}
} );
Všechny komponenty také mohou vyvolávat události pro některá rozhraní: MouseListener
, MouseMotionListener
, MouseWheelListener
, KeyListener
, ComponentListener
, FocusListener
a další.
Ukázku použití událostí můžete rovněž najít v závěrečném příkladu z předchozího článku.
Dialog
Nyní, když už rozumíme zpracování událostí, se podíváme na další komplexnější příklad. Napíšeme si třídu, která zobrazuje dialog se dvěma tlačítky a textem. Tento dialog pak budeme moci využít v libovolném programu.
Třídu pojmenujeme MujDialog
a bude potomkem třídy Dialog
. Té se v parametru konstruktoru předává rámec, do kterého se má dialog vložit. Proto i konstruktor naší třídy má parametr typu java.awt.Frame
. Aby zobrazení dialogu bylo co nejjednodušší (nemusel se v kódu vytvářet rámec a volat konstruktor), bude třída dále obsahovat několik statických metod zobrazOtazku()
, které založí patřičnou třídu, nastaví její parametry a zobrazí dialog (metodou show
). Pokud bude tato metoda zavolána s jedním textovým parametrem, bude tento použit jako zobrazený text a tlačítka se pojmenují „Ano“ a „Ne“. Pokud budou parametry tři, budou další dva použity pro popisy tlačítek.
Po stisku tlačítka (ošetřeno reakcí na událost) bude dialog zavřen a návratová hodnota (konstanta MujDialog.ANO
případně MujDialog.NE
) vrácena jako hodnota funkce zobrazOtazku()
.
Další statická metoda se bude jmenovat zobrazOzmaneni()
a oproti předchozí se bude lišit v tom, že zobrazí pouze jedno tlačítko (s implicitním textem „OK“).
MujDialog.java:
import java.awt.*;
import java.awt.event.*;
public class mujDialog
extends Dialog {
public static int ANO = 1;
public static int NE = 2;
Panel panel1 = new Panel();
BorderLayout borderLayout1 = new BorderLayout();
Panel panel2 = new Panel();
Button buttonAno = new Button();
Button buttonNe = new Button();
Label label1 = new Label();
int vysledek;
public mujDialog(Frame p0, String text, String tlacitko1, String tlacitko2) {
super(p0, true);
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
add(panel1);
panel1.setLayout(borderLayout1);
this.setSize(new Dimension(400, 150));
this.setTitle(„Muj dialog“);
label1.setText(text);
panel1.add(label1, BorderLayout.CENTER);
panel1.add(panel2, BorderLayout.SOUTH);
buttonAno.setLabel(tlacitko1);
buttonAno.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
buttonAno_actionPerformed(e);
}
});
panel2.add(buttonAno, null);
if (tlacitko2 != null) {
buttonNe.setLabel(tlacitko2);
buttonNe.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
buttonNe_actionPerformed(e);
}
});
panel2.add(buttonNe, null);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
// Zajistuje, aby se dialog byl zrusen pri zavreni okna (ve Windows krizkem vpravo)
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
void buttonAno_actionPerformed(ActionEvent e) {
vysledek = this.ANO;
hide();
}
void buttonNe_actionPerformed(ActionEvent e) {
vysledek = this.NE;
hide();
}
static int zobrazOtazku(String otazka, String tlacitko1, String tlacitko2) {
mujDialog mujDialog1 = new mujDialog(new Frame(), otazka, tlacitko1, tlacitko2);
mujDialog1.show();
return mujDialog1.vysledek;
}
static int zobrazOtazku(String otazka) {
return zobrazOtazku(otazka, „Ano“, „Ne“);
}
static int zobrazOznameni(String otazka, String tlacitko) {
mujDialog mujDialog1 = new mujDialog(new Frame(), otazka, tlacitko, null);
mujDialog1.show();
return mujDialog1.vysledek;
}
static int zobrazOznameni(String otazka) {
mujDialog mujDialog1 = new mujDialog(new Frame(), otazka, „OK“, null);
mujDialog1.show();
return mujDialog1.vysledek;
}
}
Příklad použití třídy MujDialog:
if (MujDialog. zobrazOtazku („Libi se vám Java?“)==MujDialog.ANO) {
System.out.println(„To je dobře“);
} else {
System.out.println(„To je škoda“);
}
int vysledek = MujDialog.zobrazOtazku („Jste doma nebo v práci?“, „Doma“, „V práci“);
if (vysledek==MujDialog.ANO) MujDialog.zobrazOznameni („To se máte!!“);
if (vysledek==MujDialog.NE) MujDialog.zobrazOznameni („Tak pracujte!! :-)“);
Dokázali byste podobným způsobem vytvořit dialog pro zadávání textu?
Závěr
Tímto článkem jsme vyčerpali základy jazyka Java. Na takto malém prostoru se dá popsat opravdu pouze hrubý základ obzvláště u tak bohatého jazyka, jakým Java bezesporu je. Pokud se vám Java zalíbila a hledáte více materiálů, chtěl bych vám doporučit oficiální stránky Javy společnosti SUN Microsystems http://java.sun.com, kde najdete jak kompletní dokumentaci a všechny verze JDK (Java Development Kit), tak i množství příkladů a průvodců pro základní i značně pokročilé oblasti Javy.
Starší komentáře ke článku
Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.
Mohlo by vás také zajímat
-
Užitečné nástroje pro bezpečnost na internetu
17. října 2024 -
Thunderbolt 4 vs. OCuLink: Přišel čas na upgrade?
27. května 2024 -
Vlastní web: Jak nainstalovat WordPress?
24. června 2024 -
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024
Nejnovější
-
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024 -
Šokující data od Microsoftu: Kyberútoky rostou o stovky procent!
8. listopadu 2024 -
Chcete jedinečnou doménu? Objevte koncovky FOOD, MEME a MUSIC!
7. listopadu 2024 -
OpenAI představilo novou funkci ChatGPT Search
6. listopadu 2024