Nyissunk ki egy ablakot!

A projekthez

A terv az, hogy a Main-ban nincs semmi más, csak egy programsor, ami létrehoz egy új FirstWindow példányt:

public class Main {

    public static void main(String[] args) {
        new FirstWindow();
    }

}

Miért nem valami=new FirstWindow()?

Azért nem tároljuk az ablak példány értékét sehova, mert úgysem használjuk sehol. Légy szemfüles: vége is a programnak :) Annak ellenére, hogy így írtuk, a FirstWindow konstruktora meg fog hívódni.

A terv másik része, hogy - mivel most nagyon szépen programozunk - a programunk minden darabkáját külön osztályba tesszük, pont úgy, ahogy Jack és Jane és a Kocsma során megtanultuk.

Tehát az ablakunk is egy külön osztály lesz:

public class FirstWindow {

}

Nagyszerű. Szóval akkor induláskor meghívódik a FirstWindow konstruktora - ami most a megörökölt alap konstruktor lesz, ami nem csinál semmit, emiatt ugyan a program látványosan egyszerű, de még nincs ablakunk :)

Csináljunk konstruktort:

public class FirstWindow {

    public FirstWindow() {
    }

}

Ó, mostmár a saját kódunk nem csinál semmit, micsoda megvalósított letisztult Zen harmónia! No de mi ablakot akartunk, szóval haladjunk tovább:

Csináljunk konstruktort:

public class FirstWindow extends Form {

    public FirstWindow() {
        window().show();
    }

}

Hm, két újdonság:

(Ha esetleg a Form pirossal alá van húzva, akkor organize imports azaz Ctrl+Shift+O, vagy menj fölé az egérrel, és válaszd az "import Form" quickfixet. Emlékszel: import.)

Indítsd el!

Tadaa, kész az ablak!

Na milyen volt? Értelmesebb, rövidebb a program, mint a hagyományos Swing frameworkben?

Factory methodok és fluent builderek

Ha átugrottad az előző fejezetet, akkor ez a window().show() kissé fura írásmódnak tűnik, és ettől még furábbakat fogunk írni hamarosan. Két trükk van itt:

A window() által létrehozott objektum metódusa a show, ezért a window().show() írásmód.

Adjunk neki nevet!

A név az egy szöveg, és tutira van text() metódusa ennek a window() buildernek. Használjuk arra, hogy az ablak szövegét (azaz a fejléc szövegét) beállítsuk:

public class FirstWindow extends Form {

    public FirstWindow() {
        window().text("Hello").show();
    }

}

Tegyünk bele egy labelt!

A label egy olyan widget, ami fix szöveget tartalmaz, és a program futása során nem változik a szöveg sosem.

public class FirstWindow extends Form {

    public FirstWindow() {
        window().text("Hello").add(label("Szia világ!")).show();
    }

}

Hm, nem rossz, bár kezd kicsit széles lenni (és vízszintesen nem szeretünk görgetni). Közben elkezdtek támadni a zárójelek is! Mi lenne, ha ugyanezt másképpen tördelnénk, és minden .-al kezdődő részt új sorba raknánk?

public class FirstWindow extends Form {

    public FirstWindow() {
        window()                // legyen egy ablak
        .text("Hello")          // aminek a text-je legyen helló
        .add(                   // aminek a belsejébe tegyünk...
            label("Szia világ!")//   egy labelt, aminek a szövege Szia világ
        )
        .show();                // és végül mutassuk meg az ablakot      
    }

}

Mit is mondhatnék, itt Alan Kay, a GUI és az OOP úttörője rengeteg híres mondata közül az egyik:

Az egyszerű dolgoknak egyszerűnek kell lennie, a bonyolult dolgoknak pedig lehetségesnek.

Legalábbis azt már látjuk, hogy ez tényleg egyszerű!