Java - Grafické rozhraní (42.díl)

Napsal O webu (») 5. 7. 2008 v kategorii Programování, přečteno: 2507×
obrazky/java_logo.png

Ošetření stejné události u více komponent

V programu se často vyskytuje více komponent, které generují stejné typy událostí. Na každou z událostí zpravidla budeme chtít reagovat jinak. Typickým příkladem jsou různá tlačítka, comboboxy či radiobuttony.
Komponenty generují stejný typ události, handler, který je ošetřuje, nemůže být přetížen, může být implementován pouze jednou. Metoda actionPerformed() se ve třídě smí vyskytnout pouze jednou. Doporučené řešení v tomto případě představuje použití vnitřních tříd. popř. anonymních vnitřních tříd. My se seznámíme s druhým přístupem, který je využíván ve většině nástrojů pro RAD (JBuilder, NetBeans,...).

Příklad s jedním tlačítkem. Rozhraní, které je možno implementovat, jsou uvedena v tabulce v úvodu kapitoly 1.4. Budeme se snažit ošetřit událost ActionEvent rozhraní ActionListener. Rozhraní již nebude implementováno třídou Okno, ale nějakou anonymní vnitřní třídou. Toto rozhraní obsahuje metodu actionPerformed(), která bude uživatelem předefnována. Nejprve provedeme registraci posluchače.
but.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
tlStisknuto(e);
}
});

Metodě addActionListener() předáváme jako parametr instanci anonymní třídy implementující rozhraní ActionListener. Metoda tlStisknuto()představuje handler, který je vyvolán, pokud dojde k příslušné události. V našem případě obsahuje pouze kód, který do komponenty JLabel umístí informaci o tom, že tlačítko bylo stisknuto.
public void tlStisknuto(ActionEvent e)
{
lab.setText("Stisknuto tlacitko");
}

Příklad se dvěma tlačítky. Stejným způsobem budeme postupovat i v případě, kdy se budeme snažit rozlišit, které z tlačítek bylo stisknuto. Vytvoříme dvě tlačítka, zaregistrujeme jim posluchače a u obou předefnujeme metody actionPerformed(). Uvedeme celý zdrojový kód.
public class Okno2 extends JFrame {
private JButton but1, but2;
private JLabel lab;
public Okno2(int sirka, int vyska)
{
this.setSize(sirka,vyska);
this.setTitle("Okno");
this.setLayout(new FlowLayout());
but1=new JButton("Tlacitko1");
but2=new JButton("Tlacitko2");
lab=new JLabel("Text");
this.getContentPane().add(but1);
this.getContentPane().add(but2);
this.getContentPane().add(lab);
but1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
tl1Stisknuto(e);
}
});
but2.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
tl2Stisknuto(e) ;
}
});
this.setVisible(true);
}
public void tl1Stisknuto(ActionEvent e)
{
lab.setText("Stisknuto prvni tlacitko");
}
public void tl2Stisknuto(ActionEvent e)
{
lab.setText("Stisknuto druhe tlacitko");
}
}

Podobný kód je generován prostřednictvím RAD nástrojů.
Autor: Filip Koval

Štítky: Java
Facebook Twitter Topčlánky.cz Linkuj.cz

Komentáře

Zobrazit: standardní | od aktivních | poslední příspěvky | všechno
Článek ještě nebyl okomentován.


Nový komentář

Téma:
Jméno:
Notif. e-mail *:
Komentář:
  [b] [obr]
Odpovězte prosím číslicemi: Součet čísel pět a deset