Tananyag‎ > ‎Objektumorientáció‎ > ‎

Grafikus felületek I.

Az eddigi alkalmakkor megszokhattuk, hogy programjaink kimenetét a felhasználó felé az úgynevezett Standard outputon közvetítjük, valamint a Standard inputon kérjük be. Ez ugyan gyors és célravezető megoldás, ám a legtöbb felhasználó számára kissé elrettentő lehet. Ahhoz, hogy értelmezhetőbbek, egyszerűbben kezelhetőek legyenek, szükség van egy interaktív vizuális felületre, mely újabb ízt ad alkalmazásainknak. Illetve... most kezd csak alkalmazás lenni!
GUI
A GUI egy rövidítés, melynek jelentése: Grafikus Felhasználói Interfész. Feladata... lényegében minden, ami a bevezetőben olvasható. A kommunikáció megkönnyítése a felhasználóval.
A keret
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
public class HelloAblak extends JFrame{
    int szelesseg=600;
    int hosszusag=500;
    public HelloAblak(){
        super("Ablak név");
        setSize(szelesseg, hosszusag);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setVisible(true);
    }
    public static void main(String[] args) {
        HelloAblak hello = new HelloAblak();
    }
}
Minden egyes alkalmazás egy új ablakban nyílik meg. A hagyományos értelemben vett ablakok a javax.swing.JFrame osztály gyermekei.
Az ablak maga a super konstruktorának meghívásával jön létre. Az anyaosztály ezen konstruktora az ablak nevét várja.
Méretet az ablaknak a setSize(int, int) függvénnyel adunk.
Be kell állítani azt is, hogy mi történjen a folyamatokkal, amikor az ablak bezáródik. Ez később kap értelmet, mindenesetre a programunkban mindenképp szerepelnie kell.
Végül a legfontosabb: az ablakunkat láthatóvá kell tenni, majd példányosítani kell. Ekkor az ablak megnyílik.
Máris van egy ablakunk, de ez egyelőre vajmi kevés. Töltsük hát meg tartalommal!
A tartalom
Az oldalon különböző javax.swing osztálybeli objektumok fognak helyet foglalni. Ezek szolgálnak majd felhasználói bemenetként. Ilyenek például a gomb, a szövegmező, a checkbox (jelölőnégyzet) és a csúszka. Ezeket összefoglaló néven komponenseknek nevezzük (a JComponent gyermekei). Ezeket a tartalmakat úgy hozzuk létre, ahogyan egy átlagos objektumot: példányosítjuk. Pl.: 
JButton gomb = new JButton("Ez az én első gombom");
(E konstruktor argumentuma egy szöveg, mely a gombra fog kerülni. A JKomponensek összefoglaló leírása a java dokumentációjában található.)
Mielőtt a komponensünket hozzáadnánk az ablakhoz, először az ablak belső elrendezését kell beállítani. Ezt az úgynevezett LayoutManager (elrendezéskezelő) objektumok fogják biztosítani, melyek a java.awt csomag tagjai. Ezek közül a három legfontosabb:
  • FlowLayout(): a komponenseket sorrendben fogja behelyezni az ilyen elrendezésű tárolóba (esetünkben ablakba), preferált mérettel, először sorban, aztán oszlopban ("ahogy esik, úgy puffan").
  • GridLayout(int sorok, int oszlopok, int vizszintesTavolsag, int fuggolegesTavolsag): táblázatszerű elrendezés, preferált mérettel. Cellában bal középre zár, cellatáv állítható.
  • BorderLayout(): öt mezős elrendezés (észak, dél, kelet, nyugat, közép). A "sarkokat" északnak és délnek adja. Csak az alakzat lehetséges legnagyobb méretét tartja tiszteletben.
A létrehozott "layout" objektumot egy függvénnyel adhatjuk a tárolónkhoz:
setLayout(layout)
Ezek után a tárolóhoz adhatjuk komponenseinket, egyszerűen
add(gomb).
Egyelőre azonban gombunk nem fog semmit sem csinálni: nem tudja, mit kell csinálni, ha megnyomták. Adjunk hozzá valamit, ami kezeli a megnyomás eseményét. Eseménykezelőt!
Az eseménykezelő
A javában az események kezelése interfészek segítségével történik (lásd: Interfészek). Ahhoz, hogy a gomb felismerje az osztályunkat, min egy, az esemény kezelésére alkalmas osztályt, meg kell benne valósítani egy eseménykezelőt. Az első eseménykezelőnk az ActionListener (továbbiak a javax.swing.event és a java.awt.event csomagokban). Ezt az osztályhoz az implements kulcsszóval lehet. Miután ezt megtettük, hibajelzést kapunk: meg kell ugyanis valósítani a public void actionPerformed(ActionEvent evt) eljárást. Ha ezt begépeltük, hozzá is adhatjuk a figyelni kívánt objektumhoz (itt: gomb, de lehetne szövegmező is, az is kelthet ilyen eseményt) az eseményfigyelőt:
gomb.addActionListener(this)
A gomb a komponens, melyhez az eseményfigyelőt adjuk, a this pedig arra utal, hogy az eseményt kezelő függvény ebben az osztályban van.
Ezek után -ha nem rontottunk el semmit,- az actionPerformed eljárás minden gombnyomásnál lefut. Írjuk hát meg a kívánt algoritmust:
public void actionPerformed(ActionEvent evt){
    JButton source = (JButton)evt.getSource();
    if(source==gomb){
        System.out.println("Hello word!");
    }
}
Ahhoz, hogy eseményünk a megfelelő gomb megnyomásakor történjen, tudnunk kell az esemény forrását. Ez viszont nem biztosan gomb, lehet akár szövegmező/szövegterület is, ezért ki kell kényszeríteni (castolni) JButton objektummá. Ha ez egyenlő akkor a megfelelő gombot nyomták meg, tehát az történhet, amit szeretnénk.
Persze, ez most csak egy "Hello word"-öt ír ki standard outputra, de mennyi lehetőség rejlik még benne!
Comments