5. lépés - legyenek vezérlők

Valamit kellene tenni abba az ablakba! Kezdjük a legegyszerűbbel, egy label-el!

Egy labelnek is vannak mindenféle tulajdonságai:

de a lényeg, hogy a fluent builder dolog itt is érvényes! Szóval ugyanaz a kód, mint a Window esetén, csak a labelre:

public class Label extends JLabel {
    private static final long serialVersionUID = 1L;

    private Label(Builder builder) {
        setText(builder.text);
        setIcon(builder.icon);
    }

    public static class Builder {
        private String text;
        private Icon icon;

        public Builder text(String text) {
            this.text=text;
            return this;
        }

        public Builder icon(Icon icon) {
            this.icon=icon;
            return this;
        }

        public Label build() {
            return new Label(this);
        }
    }
}

Nos, van ott az az icon() dolog. De honnan szerzünk icon-t? A 07-es részben már csináltunk ilyet: nem kevés rondasággal betöltöttünk egy ikont egy web címről.

Icon icon=new ImageIcon(ImageIO.read(new URL("http://dongo.biz/jm/resource/budapest.jpg")));

Minden világos? Az jó. Szerintem ez utálatos, és jó lenne, ha nem kellene ezzel soha többé foglalkozni. Szóval? Szóval csinálunk a builderbe egy másik icon metódust, ami String paramétert vár, és saját maga betölti a hivatkozott képet:

public Builder icon(String iconUrl) {
            try {
                this.icon=new ImageIcon(ImageIO.read(new URL(iconUrl)));
            } catch (Exception e) {
                throw new IllegalArgumentException("Can not load icon from url:"+iconUrl);
            }
            return this;
        }

No és akkor már tudunk kulturált Labelt létrehozni, opcionálisan ikonnal is:

Label label=new Label.Builder()
.text("Ez itt Budapest!")
.icon("http://dongo.biz/jm/resource/budapest.jpg")
.build();
Tulajdonképpen minden vezérlőt érdemes lenne becsomagolni ugyanígy - hiszen minden vezérlőben könnyen találunk kivetnivalót.

Valójában én be is csomagoltam mindet, de most itt kihagyom a magyarázkodást, a 09-es fejezetben mindegyiket megmutatom majd.

Builder

A builderjeink egyértelművé teszik az új label létrehozását, és megkönnyítik a label használatát - mert nem kell ez után soha többé foglalkozni az "apróságokkal" mint például kép betöltés, stb.