Több mindent az ablakba!

Ha a JFrame egy konténer, akkor tegyünk bele két dolgot! A felirat mellé egy gombot is!

public class HelloGui {
    public static void main(String[] args) {
        JFrame frame=new JFrame();
        frame.setSize(200, 100);
        frame.setTitle("Elso program");
        frame.setVisible(true);

        JLabel label=new JLabel("Gipsz Jakab");
        frame.add(label);

        JButton button=new JButton("Ok");
        frame.add(button);      
    }
}

Őőőő... ez logikusnak tűnik. Mégis, ha elindítod, csak egy hatalmas nagy gomb van az ablakban. Vajon miért?

A kézi elhelyezés

A probléma az, hogy a két label igaziból kint van az ablakban, de pont egymáson vannak, és az egyik eltakarja a másikat. Ugyanis, nem mondtuk meg, hogy hol legyenek. Alapesetben automatikusan az ablak teljes területére húzza szét a JFrame a belerakott komponenseket. (Hogy miért ezt csinálja? Szerintem sem logikus viselkedés, de ha valaki tud rá egy jó okot, jelezze!)

Két dolgot kell tennünk:

public class HelloGui {
    public static void main(String[] args) {
        JFrame frame=new JFrame();
        frame.setSize(200, 100);
        frame.setTitle("Elso program");
        frame.setVisible(true);
        frame.setLayout(null);

        JLabel label=new JLabel("Gipsz Jakab");
        frame.add(label);
        label.setBounds(5, 0, 100, 21);

        JButton button=new JButton("Ok");
        frame.add(button);
        button.setBounds(5, 25, 75, 21);
    }
}

A setBoundsnak négy paramétere van: x,y,szélesség,magasság, ami egy téglalapot jelöl ki ahol a widget lesz az ablakon belül - de ezt kitaláltad a Ctrl+Space autocomplete-ből és a a hozzá tartozó Javadoc-ból, ugye?

Feladat: Csinálj olyan széles gombot, hogy az egész ablakot végig érje!

Feladat: Próbálj meg tenni bele egy JTextField-et! Ez szerinted mire való?

LATER A layout managerek

Persze, nem igazán kellemes dolog számolgatni, hogy akkor most hova kerüljenek a dolgok. Szerencsére nem is kell, erre valók a layoutManagerek!

A layoutmanager is egy osztály, és a feladata az, hogy a konténerben szereplő widgeteket valami algoritmus szerint automatikusan rendezze el.

Tehát:

public class HelloGui {
    public static void main(String[] args) {
        JFrame frame=new JFrame();
        frame.setSize(200, 100);
        frame.setTitle("Elso program");
        frame.setVisible(true);
        frame.setLayout(new FlowLayout());

        JLabel label=new JLabel("Gipsz Jakab");
        frame.add(label);

        JButton button=new JButton("Ok");
        frame.add(button);
    }
}

Nos, alakul, nem?

Feladat: Próbáld ki ezt, és próbáld átméretezni az ablakot keskenyebbre. Mit tapasztalsz?

Feladat: Vajon hogyan lehetne más layout managerrel másként elrendezni ezeket? Keress példákat a neten és próbáld ki!