Programovßnφ v jazyce Java 8. dφl
David ètrupl
Udßlosti
UvedenΘ p°φklady ukazovaly, jak vytvo°it u₧ivatelskΘ rozhranφ. To vÜak samo o sob∞ nestaΦφ. JeÜt∞ je t°eba napsat k≤d, kter² bude n∞co provßd∞t, nap°. p°i stisknutφ tlaΦφtka. Musφme naprogramovat reakci na udßlosti, kterΘ mohou v programu nastat.
Chceme-li nap°. zareagovat na stisk tlaΦφtka, m∙₧eme p°epsat metodu action u apletu:
import java.awt.*;
import java.applet.*;
public class Test2 extends Applet{
Button okButton = new Button("OK");
public void init() {
add(okButton);
}
public boolean action(Event e, Object what){
if (e.target == okButton) {
SystΘm.out.println("Stisknut button");
}
return true;
}
}
Podobn²m zp∙sobem je mo₧nΘ reagovat na udßlosti, kterΘ vzniknou kliknutφm myÜi, stisknutφm klßvesy na klßvesnici apod. JmΘna metod, kterΘ zpracovßvajφ udßlosti, se bohu₧el zm∞nila od verze 1.0 k verzi 1.1, tak₧e je v₧dy pot°eba dßvat pozor na to, kterou verzi p°ekladaΦe a prost°edφ mßme k dispozici. Verze 1.1 podporuje i volßnφ metod z verze 1.0, tj. zp∞tnß kompatibilita byla zachovßna, musφme vÜak dßvat pozor, abychom nepou₧ili volßnφ z verze 1.1, mßme-li k dispozici pouze verzi 1.0 (nap°. v prohlφ₧eΦi).
Layout Manager
V p°edchozφch p°φkladech jsme si ukazovali, jak p°idßvat komponenty do kontejner∙ pomocφ metody add. P°i prohlφ₧enφ b∞₧φcφch program∙ vßs jist∞ napadlo, ₧e jsme nikdy nezadßvali ₧ßdnΘ sou°adnice, kam se danΘ komponenty majφ zobrazit. To v∞tÜinou nenφ t°eba, nebo¥ v knihovn∞ AWT mßme k dispozici objekty, kterΘ se o umis¥ovßnφ komponent starajφ za nßs. T∞mto objekt∙m se °φkß Layout Managery, proto₧e implementujφ rozhranφ Layout Manager.
Pou₧itφ Layout Manager∙ by se mohlo zdßt na prvnφ pohled zbyteΦnΘ a t∞₧kopßdnΘ -- proΦ bychom nemohli umis¥ovat komponenty na p°esn∞ urΦenΘ sou°adnice? ProblΘm s umis¥ovßnφm na absolutnφ sou°adnice je v tom, ₧e nikdy nevφme, jak bude vypadat fyzickΘ za°φzenφ, na kterΘm se budou naÜe komponenty zobrazovat -- nem∙₧eme v∞d∞t, jakΘ bude mφt u₧ivatel k dispozici rozliÜenφ obrazovky, jak velkΘ budou fonty atd. Layout Manager by nßs jako programßtory m∞l od t∞chto detail∙ odstφnit.
S ka₧d²m kontejnerem (potomkem t°φdy Container) je svßzßn jeden Layout Manager. Pokud jej nezm∞nφme, je pou₧it defaultnφ -- pro t°φdu Panel (a tedy i pro jejφho potomka Applet) je pou₧it FlowLayout.
FlowLayout
Objekt tΘto t°φdy pracuje tak, ₧e umis¥uje jednotlivΘ komponenty za sebou podle po°adφ vklßdßnφ p°φkazem add. Pokud se dalÜφ komponenta nevejde na °ßdek, pokusφ se ji umφstit na dalÜφ °ßdek. Toto chovßnφ je vhodnΘ, pokud do kontejneru umis¥ujeme malΘ mno₧stvφ objekt∙ (nap°. dva Buttony apod.). Pokud chceme tento LayoutManager pou₧φt i v objektech, pro kterΘ nenφ defaultnφ, m∙₧eme pou₧φt p°φkaz:
setLayout(new FlowLayout());
Tento p°φkaz je t°eba vyvolat na p°φsluÜn² kontejner, nap°. na Frame.
GridLayout
Pokud chceme umis¥ovat objekty do m°φ₧ky, m∙₧eme p°φkazem
setLayout(new GridLayout(x,y));
aktivovat nov² GridLayout. Parametry x a y urΦujφ rozm∞ry m°φ₧ky. Podφvejme se na applet, do kterΘho vlo₧φme Φty°i tlaΦφtka:
import java.awt.*;
import java.applet.*;
public class Test2 extends Applet{
public void init() {
setLayout(new GridLayout(2,2));
add(new Button("Prvni"));
add(new Button("Druhy"));
add(new Button("Treti"));
add(new Button("Ctvrty"));
}
}
Po spuÜt∞nφ si m∙₧eme vyzkouÜet, co se bude dφt, budeme-li m∞nit velikost naÜeho appletu.
BorderLayout
DalÜφm z nejb∞₧n∞jÜφch sprßvc∙ je BorderLayout -- umo₧≥uje nßm urΦit, na kterΘm mφst∞ se p°idßvanß komponenta objevφ. Pou₧φvß k tomu variantu p°φkazu add, kterß mß navφc jeÜt∞ jeden argument, kter² je p°edßn Layout Manageru. P°i pou₧itφ tohoto objektu ji₧ nezßle₧φ na po°adφ vklßdßnφ komponent jako v p°edchozφch p°φpadech. Pou₧itφ si op∞t budeme ilustrovat na p°φkladu appletu:
import java.awt.*;
import java.applet.*;
public class Test3 extends Applet{
public void init() {
setLayout(new BorderLayout());
add("North", new Button("Prvni"));
add("South", new Button("Druhy"));
add("East", new Button("Treti"));
add("West", new Button("Ctvrty"));
add("Center", new Button("Ctvrty"));
}
}
Ostatnφ
V knihovn∞ AWT mßme krom∞ ji₧ uveden²ch Layout Manager∙ jeÜt∞ mo₧nost pou₧φt nßsledujφcφ objekty:
- CardLayout -- slou₧φ k vytvo°enφ n∞kolika karet, kterΘ m∙₧eme na obrazovce st°φdat. Je to u₧iteΦnΘ v p°φpadech, kdy chceme m∞nit vzhled rozhranφ za b∞hu.
- GridBagLayout -- tento sprßvce je nejslo₧it∞jÜφ ze standardnφch sprßvc∙. Pomocφ objekt∙ t°φdy GridBagConstraints umo₧≥uje u ka₧dΘ komponenty stanovit vlastnosti p°i zm∞n∞ velikosti kontejneru.
Pokud nechceme pou₧φt ₧ßdn² Layout Manager, m∙₧eme pomocφ p°φkazu:
setLayout(null);
vypnout jejich pou₧φvßnφ. Potom se musφme starat o sou°adnice, na kterΘ danΘ komponenty umis¥ujeme, a proto to nenφ doporuΦovan² zp∙sob psanφ aplikacφ v Jav∞.
Vytvß°enφ GUI
P°i vytvß°enφ u₧ivatelskΘho rozhranφ nemusφme pou₧φvat jeden Layout Manager pro celΘ okno, do kterΘho umis¥ujeme komponenty. M∙₧eme si plochu okna rozd∞lit a v ka₧dΘ Φßsti pou₧φt jin² druh sprßvce rozmφst∞nφ. Rozd∞lenφ plochy okna nßm umo₧nφ nejjednoduÜÜφ potomek t°φdy Container -- Panel.
Panel je komponenta, kterß slou₧φ k umis¥ovßnφ dalÜφch komponent. M∙₧eme jej umφstit do libovolnΘho kontejneru, tj. m∙₧eme vytvo°it hierarchickou strukturu panel∙, kterΘ realizujφ rozmis¥ovßnφ komponent. U ka₧dΘho panelu nastavφme Layout Manager tak, aby celkov² vzhled GUI odpovφdal naÜφ p°edstav∞.
V nßsledujφcφm p°φkladu si ukß₧eme pou₧itφ n∞kolika panel∙ pro lepÜφ rozvr₧enφ komponent v appletu:
import java.awt.*;
import java.applet.*;
public class Test4 extends Applet{
public void init() {
Panel p1, p2, p3;
setLayout(new BorderLayout());
add("East", p1 = new Panel());
add("South", p2 = new Panel());
add("West", p3 = new Panel());
p1.setLayout(new GridLayout(3,1));
p1.add(new Checkbox("Jedna"));
p1.add(new Checkbox("Dve"));
p1.add(new Checkbox("Tri"));
p3.setLayout(new GridLayout(3,1));
p3.add(new Checkbox("Maslo"));
p3.add(new Checkbox("Pivo"));
p3.add(new Checkbox("Rohlik"));
p2.add(new Button("Ok"));
}
}
Tato ukßzka po spuÜt∞nφ zobrazφ applet, ve kterΘm budou jednotlivΘ komponenty umφst∞ny ve skupinßch urΦen²ch jednotliv²mi panely.
Pomocφ panel∙ a n∞kolika mßlo Layout Manager∙ se dß dosßhnout sluÜnΘ ·rovn∞ zobrazenφ bez toho, ani₧ bychom nastavili jedinou sou°adnici, kam se majφ jednotlivΘ komponenty zobrazovat.