WebElektronika

Események a Java nyelvben (ActionListener)

person access_time 2014.06.03.
Hogyan használhatjuk az ActionListener-t a swing-es alkalmazásoknál? Mi történjen, ha rákattintunk egy nyomógombra? Megnézünk most erre két lehetőséget.


A korábbi cikkekben (link, link) már bemutattuk a swing-es alkalmazások készítésének több lehetőségét. Most megnézzük annak a lehetőségét, hogy hogyan tudunk a nyomógombokhoz (JButton) eseményt rendelni. És természetesen az a cél, hogy nyomógombokat meg tudjuk különböztetni.

A későbbi Java-val foglalkozó cikkeinkben pedig további eseménytípusok megvalósítását is megnézzük.

Hozzunk létre egy új projektet (javaEsemenyButton) a NetBeans segítségével (1. ábra). 


1. ábra   A projekt létrehozása
 

Használjuk fel a korábbi cikkünkben bemutatott java kódokat azzal a különbséggel, hogy az ablak osztályt (ablak.java) módosítsuk. Vegyük ki a jb3 nyomógombot és tegyünk bele még egy JLabel példányt (jl2).

package javaesemenybutton;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class ablak extends JFrame {
    JButton jb1, jb2;
    JLabel jl1, jl2;
    JPanel jpan;
        
    public ablak(){
        super("WebElektronika");
        setSize(350,250);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
        jb1 = new JButton("első");
        jb2 = new JButton("második");
        jl1 = new JLabel("webelekronika.com, 2014.");
        jl2 = new JLabel("Itt lesz az eredmény");
    
        jpan = new JPanel();
        jpan.setLayout(null);
        jb1.setBounds(20, 30, 100, 40);
        jb2.setBounds(20, 80, 100, 40);
        jl1.setBounds(50, 160, 150, 20);
        jl2.setBounds(150, 50, 150, 20);
        jpan.add(jb1);
        jpan.add(jb2);
        jpan.add(jl1);
        jpan.add(jl2);
        add(jpan);
        setVisible(true);
    }

}

Futtassuk most a projektet, nyomjuk meg az F6 funkcióbillentyűt! A futási eredmény a 2. ábrán látható.


2. ábra   Futási eredmény
 

A tervünk az, hogy a két nyomgomb (jb1, jb2) lenyomásakor megváltoztassuk a jl2 objektum Text tulajdonságát, azaz, módosítsuk a kiírt szöveget. Erre két megoldást is nézünk.

 

Közös esemény

Először egy közös eseményt hozunk létre és a két nyomógombot erre iratjuk fel. Ehhez implementálni kell az ActionListener interfészt. Kezdjük el beírni az osztály neve (ablak osztály) mellé az intefész nevét, majd nyomjuk meg a CTRL+Space-t (3. ábra).


3. ábra   Az ActionListener megadása
 

Látható, hogy importáltuk a "import java.awt.event.ActionListener"-t is. Viszont hibás lett a 7. sor, mert az interfész metódusát nem implementáltuk. Kattintsunk a hibaikonra és a következő kép fogad minket (4. ábra).


4. ábra   Az interfész absztrakt metódusait is implementálni kell
 

Kattintsunk a felbukkanó ablak első sorára. Ekkor importáljuk a "java.awt.event.ActionListener"-t és létrehozzuk az actionPerformed eseményt (5. ábra).


5. ábra   A legenerált actionPerformed esemény
 

Iratkozzunk fel erre az eseményre! Ehhez írjuk be a 6 ábrán lévő, kék háttérrel rendelkező kódrészletet. A jb1 és a jb2 objektumoknak van 1-1 addActionListener metódusa, a paraméterlistába írjuk be a "this"-t.


6. ábra   A módosított actionPerformed esemény és a feliratkozások
 

Az actionPerformed eseményben létrehozunk egy Object típust (kuldo), amelyet egyenlővé teszünk az eseményt kiváltó nyomógomb forrásával (getSource). Az if-es feltételes szerkezettel azt vizsgáljuk, hogy melyik nyomógomb lenyomása váltotta ki az eseményt. Ha a jb1, akkor a "WebElektronika" szöveget írjuk ki a képernyőre, ha a másikra kattintottunk, akkor a "Java esemény" szöveg kerül megjelenítésre. Vegyük továbbá észre, hogy a JLabel-ből készített példány (jl2) Text tulajdonságát (ez közvetlenül nem érhető el) a setText metódussal állíthatjuk be.

 

Nincs közös esemény

Nézzük meg most a következő lehetőséget, amikor nincs közös actionPerformed esemény. Hozzunk létre egy újabb osztályt (ablak2.java), majd a main metódusban ezt példányosítsuk (ab2), és ennek a példánynak a show() metódusát hívjuk meg (7. ábra).


7. ábra   Az ablak2 osztály példányosítása
 

Másoljuk át az ablak osztály tartalmát az ablak2 osztályba, írjuk át a konstruktornak a nevét és ne implementáljuk az ActionListener interfészt. 

A jpan.add(jl2); után írjuk be a "jb1.addActionListener(new ActionL"-t, majd nyomjuk meg a CTRL+Space-t. Ekkor létrehozzuk az actionPerformed eseményt és fel is iratkozunk rá (8. ábra).


8. ábra   A létrehozott actionPerformed esemény
 

Hasonlóan járjunk el a jb2-nél is és írjuk meg a két esemény "belsejét" is (9. ábra).


9. ábra   A két actionPerformed esemény
 

Látható, hogy a két nyomógombhoz (jb1, jb2) két külön esemény tartozik, nem kell tehát if-es szerkezetet használnunk és az ActionListener interfészt sem az osztálynál implementáltuk, ahogyan azt a 4. ábrán, az előző példánál láthattuk.

Futtassuk most az alkalmazásunkat. Mivel átírtuk a main metódusunk tartalmát (7. ábra), ezért az ablak2 osztály kerül példányosításra és megjelenítésre (10. ábra).


10. ábra   A futási eredmény