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 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ó?
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!