Java 12
Grafické užívateľské
rozhranie v Jave. Základy
Cieľom tejto kapitoly je oboznámiť sa so základmi tvorby grafického rozhrania v Jave.Témy: Knižnice Swing a AWT. Umiestňovanie objektov na komponentu. Oddelenie grafického rozhrania a kódu. Krátko o appletoch.
V Jave 1.0 slúžila na
vytváranie grafického rozhrania knižnica
java.awt. Dnes je k dispozícii rozvinutejšia knižnica javax.swing, ktorá poskytuje programátorovi omnoho viac
možností a zároveň viac pohodlia. Navyše, napriek tomu, že je rozsiahla,
pri používaní jej tried sa stretávame stále s tými istými princípmi,
s jednotnou filozofiou. ( Niekedy pri stretnutí s novou triedou
dokážeme dokonca uhádnuť aj názvy metód). Swing však nie je úplne nezávislý na
AWT, používa niektoré jeho objekty a knižnice (napr. java.awt.event). My
sa v ďalšom budeme na otázku grafického rozhrania pozerať z pohľadu
Swingu.
V nasledujúcom kóde vytvoríme jednoduchú komponentu a zobrazíme ju. Konkrétne použijeme objekt triedy JFrame, patriaci do knižnice javax.swing. Je okrem iného potomkom tried java.awt.Component a java.awt.Frame. Na komponentu umiestnime jeden prvok, návestie – inštanciu triedy JLabel.
import javax.swing.*;
public class Grafika {
public
static void main(String[] args){
JFrame ram = new
JFrame("pozdrav");
ram.getContentPane().add(new
JLabel("Zdravi Ta ram."));
ram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ram.setSize(200,100);
ram.setVisible(true);
}
}
Hoci ide o veľmi krátky kód, dá sa na ňom naučiť základné veci o umiestňovaní
prvkov na komponentu a o zobrazovaní okna. Uveďme si ku kódu pár
komentárov a urobme s ním niekoľko pokusov a zmien:
1. Keď program spustíme, uvidíme, ako sa prejaví
použitie slova „pozdrav“ v konštruktore triedy JFrame. Samozrejme, mohli
by sme použiť aj konštruktor bez argumentov:
JFrame ram = new JFrame();
2. V mnohých kódoch by sme miesto výrazu „new
JLabel("Zdravi Ta ram.")“
ešte videli výraz „new Label("Zdravi Ta ram.")“. Label je
trieda z knižnice java.awt a tak by sme túto knižnicu potrebovali importovať. Prvky
z knižnice java.awt možno vidieť v appletoch častejšie než
v iných aplikáciách. Je to preto, lebo zaberajú menej pamäte ako prvky
z knižnice javax.swing a niektoré prehliadače „spoznajú“ swing až za
pomoci plug-inu.
3. Rozpíšme
riadok
ram.getContentPane().add(new JLabel("Zdravi Ta
ram."));
podrobnejším spôsobom:
Container cp = ram.getContentPane();
JLabel navestie = new
JLabel("Zdravi Ta ram");
cp.add(navestie);
V prvom riadku sme vytvorili komponentu z triedy Container .(Pri
prekladaní tohto riadku naprv prekladač vyhlási, že túto triedu nepozná. Keď do
hlavičky pridáme príkaz „import java.awt.*;
“ , riadok
sa preloží.)
V druhom riadku vytvoríme návestie
z triedy JLabel.
V treťom návestie na komponentu umiestnime.
4. Príkaz „
ram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);“ je potrebný na to, aby po
zavrení okna metóda main() ukončila svoju činnosť.
Skúste ho na chvíľu zakomentovať, potom preložte kód
a spustite program.
5. Príkaz „ram.setSize(200,100);“ určuje veľkosť
okna, ktoré uvidíme. Ak by sme sa
spoľahli na automatické nastavenie veľkosti, stačilo by miesto neho použiť
príkaz „ram.pack()“. V našom prípade je však zobrazené návestie také
krátke, že v hlavičke okna by sa nezobrazil celý text slova „pozdrav“. Použite príkaz ram.pack()
a sledujte túto zmenu. Potom preeditujte text návestia na dlhší
a znovu spustite program.
6. Až príkaz „ram.setVisible(true); “ spôsobí, že
okno sa naozaj zobrazí.
Umiestňovanie prvkov na komponentu
V predchádzajúcom kóde sme, videli, že akonáhle máme vytvorenú inštanciu triedy Container, môžeme na ňu uložiť určitý prvok. Pokúsme sa Kód GR1.1 upraviť, doplniť tak, aby sme mohli na komponentu uložiť viac prvkov. Budeme pracovať s týmito prvkami:
-
textové
políčko, použijeme inštanciu triedy
JtextField
-
tlačítko,
použijeme inštanciu triedy JButton
-
textové
pole, použijeme inštanciu triedy JtextArea
Pozrite si v dokumentácii komentár ku
príslušným konštruktorom, ktoré používame na vytvorenie vyššie uvedených
prvkov.
import javax.swing.*;
import java.awt.*;
public class UkladajPokus {
public
static void main(String[] args){
JFrame ram = new
JFrame("Ukladanie");
Container cp = ram.getContentPane();
JTextField policko = new JTextField("Textove
policko", 30);
JButton gombik = new JButton("stlac
ma");
JTextArea pole = new JTextArea("
Textove pole ", 10,20);
cp.add(policko);
cp.add(gombik);
cp.add(pole);
ram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ram.pack();
ram.setVisible(true);
}
}
Keď tento pokusný kód odladíme a spustíme, zistíme, že v okne vidíme iba posledný z pridaných prvkov. Pri takomto spôsobe ukladania, sa totiž jednotlivé prvky prekryjú a vidno iba posledný. To sa dá zistiť aj tak, že zakomentujeme jeden až dva riadky s príkazom „add()“ a sledujeme, ako sa vzhľad okna mení.
Tento výsledok by mal byť podnetom k tomu, sme sa poobzerali po lepšom spôsobe pridávania prvkov – komponent. V Jave sú vytvorené na tento účel triedy „layout manager“. Majú na starosti práve umiestňovanie komponent v kontajnerovej komponente. Sú odvodené od rozhrania java.awt.LayoutManager (poprípade java.awt.LayoutManager2). My tu použijeme triedu FlowLayout, kvôli jednoduchému zaobchádzaniu.
V kóde GR1.2Pokusny pridáme pod riadok
Container cp = ram.getContentPane();
nový riadok:
cp.setLayout(new FlowLayout());
Tento zariadi, že o ukladanie komponent sa bude odteraz starať FlowLayout. Keď kód preložíme a spustíme, vidíme, že sa zobrazili všetky komponenty. Mohli by sme si gratulovať k úspechu, ale ako to už býva, s jedlom rastie chuť.
Áno, žiaľ, všetky tri komponent sú zobrazené v jednom riadku. A my by sme chceli,aby bolo textové pole v druhom riadku. pod textovým políčkom a tlačítkom.
Príkaz „ram.pack()“ v našom kóde spôsobil vytvorenie takej veľkej kontajnerovej komponenty, do ktorej sa všetky ukladané komponenty zmestia na jeden riadok. Ak nahradíme tento príkaz príkazom typu „setSize(int vyska,int sirka) a výšku a šírku vhodne zvolíme, dosiahneme želané usporiadanie komponent. Upravíme ešte šírku textového políčka. Výsledkom je nasledujúci kód a príslušný vzhľad okna.
Kód GR1.2
import javax.swing.*;
import java.awt.*;
public class Ukladaj {
public static void main(String[] args){
JFrame ram = new
JFrame("Ukladanie");
Container cp = ram.getContentPane();
cp.setLayout(new FlowLayout());
JTextField policko = new JTextField("Textove policko", 12);
JButton gombik = new JButton("stlac ma");
JTextArea pole = new JTextArea(" Textove pole ", 10,20);
cp.add(policko);
cp.add(gombik);
cp.add(pole);
ram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ram.setSize(400,250);
//ram.pack();
ram.setVisible(true);
}
}
Keď kód spustíme a začneme sa hrať s vytvoreným oknom, zistíme nasledovné: Môžeme stláčať tlačítko. Môžeme písať do textového políčka. Môžeme písať do textového poľa. Môžeme zavrieť okno.
Samozrejme, (a žiaľ), po stlačení tlačítka sa nič nedeje. Pretože nič nie je naprogramované.
Ak by sme sa chceli naučiť vytvárať v Jave rôznorodé a dokonale vyzerajúce okná, okná od výmyslu sveta, mohli by sme tejto činnosti zasvätiť pár nasledujúcich týždňov či mesiacov. My tu však radšej hneď vezmeme okno, vytvorené v predchádzajúcom kóde a budeme sa snažiť, aby vykonávalo nejakú zmysluplnú aktivitu.
Naprogramujme pre okno napríklad takúto činnosť:
Do textového políčka sa zadá text. Po stisnutí tlačítka sa v textovom poli zobrazí nasledovné
a) ak je tento text invertovateľný, t.j. odzadu sa číta takisto ako odpredu, zobrazí sa on sám aj s gratuláciou
b) inak sa zobrazí tento text a hneď za ním ten istý text odzadu
Skôr, ako sa pustíme do „spojazdňovania“ nášho okna, napíšme si Kód GR1.2 v inom tvare. Tento nový tvar zabezpečí to isté, ako predošlý kód –púhe zobrazenie okna aj s príslušnými prvkami. Bude sa nám však oveľa ľahšie doplňovať tak, aby okno vykonávalo vyššie opísanú činnosť.
Kód GR1.3
import javax.swing.*;
import java.awt.*;
public class UkladajB {
private JFrame ram = new JFrame("Ukladanie");
private JTextField policko = new JTextField("Textove policko",12);
private JButton gombik = new JButton("stlac ma");
private JTextArea pole = new JTextArea(" Textove pole ", 10,20);
public void init(){
Container cp = ram.getContentPane();
cp.setLayout(new FlowLayout());
cp.add(policko);
cp.add(gombik);
cp.add(pole);
ram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ram.setSize(400,250);
ram.setVisible(true);
}
public static void main(String[] args){
UkladajB prvy = new UkladajB();
prvy.init();
}
}
Pripravme si aj triedu, ktorá bude mať na starosti spracovanie vstupného textu. Bude to trieda Invertuj, ktorá vo svojej jedinej metóde
Public String dajText(String povodny)
Bude vykonávať činnosti, opísané vyššie v častiach a) a b).:
class Invertuj{
public String dajText(String povodny){
StringBuffer sb = new StringBuffer(povodny);
String opak = sb.reverse().toString();
if(povodny.equals(opak)) {
return "Gratulujem, text je invertovatelny: \n" + opak;
}
else{
return "novy text:\n " + povodny.concat(opak);
}
}//EOMethod
}//EOClas
Teraz pár slov o tom, ako knižnica Swing pracuje s grafickým rozhraním a s kódom (ktorý určuje, čo sa má stať, ak na nejakej komponente nastane určitá udalosť.)
Filozofiou Swingu je oddeliť rozhranie, reprezentované grafickými komponentami, od implementácie – kódu. Komponenty majú schopnosť hlásiť udalosti, ktoré na nich nastanú, ktoré sa im stanú. Na to, aby sme tieto udalosti mohli zaregistrovať a potom na ne reagovať, existujú takzvané Listenery. (V dokumentácii si môžete bližšie prezrieť rozhrania java.util.EventListener a java.awt.event.EventListener.) Ak chceme Listener použiť, treba ho pomocou príslušnej metódy typu „add....Listener(...)“ pridať k danej komponente.
Tento pomerne jednoduchý a účinný mechanizmus si predvedieme na komponente typu tlačítko. S ostatnými komponentami a triedami typu „Listener“ je práca obdobná. V našom kóde pridáme Listener ku tlačítku príkazom
gombik.addActionListener(posluchac);
kde „posluchac“ bude ukazovať na konkrétnu inštanciu vnútornej triedy, implementujúcej rozhranie ActionListener. Pre toto rozhranie treba implementovať jednu metódu: actionPerformed(). Táto metóda sa zavolá, keď užívateľ stisne tlačítko „gombik“.
Poznámka: Pomocnú triedu Listener zahrnieme rovno do nášho kódu.
Buďme už konkrétni:
Kód GR1.4
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class Invertuj{
public String dajText(String povodny){
StringBuffer sb = new StringBuffer(povodny);
String opak = sb.reverse().toString();
if(povodny.equals(opak)) {
return "Gratulujem, text je invertovatelny: \n" + opak;
}
else{
return "novy text:\n " + povodny.concat(opak);
}
}//EOMethod
}//EOClass
public class UkladajApracuj {
private JFrame ram = new JFrame("Invertovanie");
private JTextField policko = new JTextField("Textove policko",12);
private JButton gombik = new JButton("stlac ma");
private JTextArea pole = new JTextArea(" Textove pole ", 10,20);
class PosluchacTlacitka implements ActionListener {
public void actionPerformed(ActionEvent e) {
String text = policko.getText();
Invertuj inv = new Invertuj();
text = inv.dajText(text);
pole.setText(text);
}
}
PosluchacTlacitka posluchac = new PosluchacTlacitka();
public void init(){
gombik.addActionListener(posluchac);
Container cp = ram.getContentPane();
cp.setLayout(new FlowLayout());
cp.add(policko);
cp.add(gombik);
cp.add(pole);
//mohli by sme pridat posluchaca az tu
//gombik.addActionListener(posluchac);
ram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ram.setSize(400,250);
ram.setVisible(true);
}
public static void main(String[] args){
UkladajApracuj prvy = new UkladajApracuj();
prvy.init();
}//EOMain
}//EOClass
Poznámky ku kódu:
Kvôli rozhraniu ActionListener sme importovali knižnicu java.awt.event. Trieda „PosluchacTlacitka“ je vnútorná, preto pozná objekty, ktoré patria triede UkladajApracuj. Konkrétne je schopná pracovať s tlačítkom „gombik“, textovým políčkom „policko“ a textovým poľom „pole“.
Prvý funkčný applet
Keď už vieme vytvárať programy s grafickým rozhraním,teda kódy ako bol kód GR1.4, je pomerne ľahké vyrobiť y nich kód pre applet. V kóde GR1.4 bolo jedno, či sa metóda public void init() volá „init()“, alebo nejako inak. Ak sa však pozrieme do dokumentácie triedy JApplet, do sekcie
„Methods inherited from class java.applet.Applet“, zistíme, že tu vystupuje práve metóda s menom init(). Tá pri appletoch slúži na inicializáciu appletu, môžeme si ju predstaviť aj ako akýsi druh konštruktoru.
Metódu „init()“ by sme teda v kóde Gr1.4 mali. Ak sa ešte dozvieme, že applet nepotrebuje pre svoju činnosť metódu main, že ho prehliadač spustí napríklad pomocou metódy „init()“, môžeme dostať nasledujúci nápad:
Vymažme v kóde Gr1.4 metódu „main()“ a máme applet. Ide oveľmi naivnú myšlienku, ale kupodivu, je na nej veľký kus pravdy. Háčik je ešte v tom, že ak vytvárame applet, tak vytvárame akýsi objekt triedy Applet z knižnice java.applet, alebo JApplet (to je jeho swingovský dedič).
Čo tak druhý naivný nápad? Zdeďme triedu, opísanú v kóde Gr1.4 od triedy JApplet a máme vytvorený Applet!
Teraz sme už blízko pravde takmer na sto percent. Po malilinkom kozmetickom doplnku naozaj už budeme môcť tento kód spustiť ako applet.
Ale buďme zase konkrétni:
(Poznámka. Triedu UkladajAPracuj premenujeme na AppletUaP, čiste preto, aby sme mohli aj naďalej spúšťať starý aj nový kód bez kolízií.)
Kód Gr1.5
//<applet code=AppletUaP width=400 height=250></applet>
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class Invertuj{
public String dajText(String povodny){
StringBuffer sb = new StringBuffer(povodny);
String opak = sb.reverse().toString();
if(povodny.equals(opak)) {
return "Gratulujem, text je invertovatelny: \n" + opak;
}
else{
return "novy text:\n " + povodny.concat(opak);
}
}//EOMethod
}//EOClass
public class AppletUaP extends JApplet {
private JFrame ram = new JFrame("Invertovanie");
private JTextField policko = new JTextField("Textove policko",12);
private JButton gombik = new JButton("stlac ma");
private JTextArea pole = new JTextArea(" Textove pole ", 10,20);
class PosluchacTlacitka implements ActionListener {
public void actionPerformed(ActionEvent e) {
String text = policko.getText();
Invertuj inv = new Invertuj();
text = inv.dajText(text);
pole.setText(text);
}
}
PosluchacTlacitka posluchac = new PosluchacTlacitka();
public void init(){
gombik.addActionListener(posluchac);
Container cp = ram.getContentPane();
cp.setLayout(new FlowLayout());
cp.add(policko);
cp.add(gombik);
cp.add(pole);
//mohli by sme pridat posluchaca az tu
//gombik.addActionListener(posluchac);
ram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ram.setSize(400,250);
//ram.pack();
ram.setVisible(true);
}
/* public static void main(String[] args){
AppletUaP prvy = new AppletUaP();
prvy.init();
}*/
}
Okomentujme zmeny.
To, čo sme vyrobili, je applet viditeľný na appletvieweri.
Ak by sme ponechali , odkomentovali main(), aplikácia nám zbehne aj z príkazového riadku. Appletviewer sa zaujíma iba o text medzi značkami <applet> a </applet>. Ten mu povie, že má vyhľadať súbory s príponou „class“, ktoré vznikli po preložení kódu AppletUaP.java. Appletvieweru je jedno, z akého dokumentu tento text a tieto značky prečíta. Bežne sa predpokladá, že to bude text html stránky, napríklad takejto:
<HTML>
<BODY>
Text pred appletom.
<p>
<applet code=AppletUaP width=400 height=250></applet>
</APPLET>
<p>
Text po applete.
<BODY>
<HTML>
Nech by sa táto stránka volala napríklad MojApplet.html. Applet môžeme uvidieť v appletvieweri tak, že v príkazovom riadku napíšeme:
javac AppletUaP.java
appletviewer MojApplet.html
Keďže sme však návestia, podstatné pre appletviewer napísali už do prvého riadku súboru AppletUaP.java, môžeme applet uvidieť aj takto:
javac AppletUaP.java
appletviewer AppletUaP.java
Tento druhý spôsob sa často používa preto, lebo je oveľa pohodlnejší a spoľahlivejší pri ladení. Navyše, ak už je aj všetko dobre odladené a applet sa v appletvieweri zobrazí, ešte stále nám môže robiť problémy prehliadač. Môže byť zle nastavený, alebo jednoducho nemusí poznať novšie verzie Javy.
Urobte teraz pokus. Keď sa vám applet bez problémov zobrazil v appletvieweri pomocou riadkov
javac AppletUaP.java
appletviewer MojApplet.html
(t. j. keď ste predtým vyššie spomínanú HTML stránku vyrobili),
skúste stránku MojApplet.html otvoriť prehliadačom.
Ak sa Vám applet objavil na appletvieweri a v prehliadači nie, treba upraviť prehliadač ... stránku html ... alebo si obstarať inú verziu prehliadača. Tieto problémy, dosť časté, sú mimo témy našej kapitolky. Pokúsme sa však ošetriť jav, keď prehliadač reaguje len na staršie verzie Javy. Upravme predchádzajúci kód tak, že v ňom použijeme miesto swingovských tried triedy z AWT. Metódu main už nepoužijeme. Porovnávanie predošlého a nasledujúceho kódu plus pohľady do dokumentácie by mali stačiť na pochopenie toho, ako sme kód prepísali:
Kód Gr1.5
//<applet code=PAWT width=400 height=250></applet>
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
class Invertuj{
public String dajText(String povodny){
StringBuffer sb = new StringBuffer(povodny);
String opak = sb.reverse().toString();
if(povodny.equals(opak)) {
return "Gratulujem, text je invertovatelny: \n" + opak;
}
else{
return "novy text:\n " + povodny.concat(opak);
}
}//EOMethod
}//EOClass
public class PAWT extends Applet {
private TextField policko = new TextField("Textove policko", 12);
private Button gombik = new Button("stlac ma");
private TextArea pole = new TextArea(" Textove pole ", 10,20);
class PosluchacTlacitka implements ActionListener {
public void actionPerformed(ActionEvent e) {
String text = policko.getText();
Invertuj inv = new Invertuj();
text = inv.dajText(text);
pole.setText(text);
}
}
PosluchacTlacitka posluchac = new PosluchacTlacitka();
public void init(){
gombik.addActionListener(posluchac);
setLayout(new FlowLayout());
add(policko);
add(gombik);
add(pole);
setSize(250,400);
setVisible(true);
}
}
To bol kód.
Teraz html stránka:
<HTML>
<BODY>
Text pred appletom.
<p>
<APPLET CODE="PAWT.class" WIDTH=450 height=200>
</APPLET>
<p>
Text po applete.
<BODY>
<HTML>
V kóde sme už neukladali ukladali komponenty na inštanciu triedy Frame, pretože ich môžeme rovno pridávať k Appletu. Na appletvieweri aj na htlm stránke sa applet zobrazí tak, ako treba. Z tohto pohľadu sme rám používali vlastne len kvôli zobrazeniu pri spustení z konzoly.
Kód Gr1.6
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
class
Invertuj{
public String dajText(String povodny){
StringBuffer
sb = new StringBuffer(povodny);
String
opak = sb.reverse().toString();
if(povodny.equals(opak))
{
return "Gratulujem, text je
invertovatelny: \n" + opak;
}
else{
return "novy text:\n " + povodny.concat(opak);
}
}//EOMethod
}//EOClass
public
class StaryDobryApplet extends Applet {
private TextField policko = new TextField("Textove policko",
14);
private Button gombik = new
Button("stlac ma");
private TextArea pole = new TextArea("
Textove pole ", 10,28);
class
PosluchacTlacitka implements ActionListener {
public
void actionPerformed(ActionEvent e) {
String
text = policko.getText();
Invertuj inv = new Invertuj();
text =
inv.dajText(text);
pole.setText(text);
}
}
PosluchacTlacitka posluchac = new PosluchacTlacitka();
public
void init(){
gombik.addActionListener(posluchac);
setLayout(new FlowLayout());
add(policko);
add(gombik);
add(pole);
setSize(300,300);
setVisible(true);
}
}
//EofClass
A príslušná html stránka:
<HTML>
<BODY>
Text pred appletom.
<P>
<APPLET CODE="StaryDobryApplet.class"
WIDTH=300 height=300>
</APPLET>
</P
<P>
Text po applete.
<BODY>
<HTML>
Slovo na
záver: Táto kapitolka ukazuje, že s predchádzajúcimi vedomosťami
o dedičnosti, rozhraniach a vnútorných triedach sme schopní rýchlo
vytvoriť aplikáciu s jednoduchým grafickým rozhraním, poprípade applet. Zároveň
však nastoľuje veľa otázok. Vymenujme niektoré z nich:
1. Aké typy Layout manažerov existujú, ako sa
s nimi pracuje? Aké komponenty možno ukladať na aké? Možno tlačítko
dekorovať obrázkom? Aké rôzne komponenty núka Swing a Awt? Ako vyriešiť
otázku fontov s diakritikou? Atď atď. Vo všeobecnosti: aké nástroje máme
k dispozícii na vytvorenie a používanie grafického rozhrania?
2. Aké rôzne typy Listenerov existujú? Aké udalosti
Java rozozná a vie na ne zareagovať? Aké ďalšie mechanizmy núka Java na
oddelenie kódu od grafického rozhrania?
3. Ako vytvoriť pekný, moderný applet, ako ho uložiť ho
na internete, ako zabezpečiť, aby sa stránka správne zobrazila?
My sa v ďalších krátkych kapitolkách sústredíme
na pár vybraných otázok z jednotky a dvojky. Podrobnejšiu odpoveď na
tieto otázky nájde čitateľ vo výbornej Eckelovej knihe. Vyčerpávajúce
pojednania o Swingu sú diela, majúce cez tisícku strán. Ešte k otázke
appletov: Knižnica AWT a tvorenie appletov pomocou tejto knižnice je dobre
opísané v druhom dieli Heroutovej knihy o Jave. Applety
a grafické rozhranie spracúva z jednotného pohľadu vo svojej knihe
Eckel. Tieto dva zdroje už stačia na to, aby ste sa naučili vytvárať veľmi
rôznorodé applety. A ako vždy -
najnovšie zmeny a odpovede na najnovšie otázky nájdete na stránkach Sunu,
alebo na iných stránkach, špecializovaných na Javu.
CvGr1.1 Používanie anonymných vnútorných tried. Keď
v kóde použijeme jedinú inštanciu vnútornej triedy, niekedy túto triedu
nepotrebujeme ani pomenovať. Čo je pre nás dôležité je to, aby implementovala
to správne rozhranie. Presvedčte sa, že
v kóde Gr1.4 by sme miesto nasledujúcich riadkov:
class PosluchacTlacitka implements ActionListener {
public void
actionPerformed(ActionEvent e) {
String
text = policko.getText();
Invertuj
inv = new Invertuj();
text =
inv.dajText(text);
pole.setText(text);
}
}
PosluchacTlacitka posluchac = new PosluchacTlacitka();
Mohli rovno napísať:
ActionListener posluchac = new ActionListener() {
public void
actionPerformed(ActionEvent e) {
String text = policko.getText();
Invertuj
inv = new Invertuj();
text =
inv.dajText(text);
pole.setText(text);
}
};
(Bodkočiarka na konci teraz musí byť. Kód hovorí: vytvor mi inštanciu rozhrania ActionListener, implementovanú anonymnou triedou, ktorú tu definujem.)
Dokonca aj vyššie spomenutý kód by sa dal vynechať. Miesto toho by sme rovno v metóde init() pri pridávaní listenera mohli pridať inštanciu listenera bez odkazu. Veď na túto inštanciu sa v programe aj tak nikdy neodvolávame. Overte si to. Vymažte vyššie uvedené riadky a v metóde init() miesto riadku
gombik.addActionListener(posluchac);
dajte tento text:
gombik.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String
text = policko.getText();
Invertuj
inv = new Invertuj();
text =
inv.dajText(text);
pole.setText(text);
}
});
Program odlaďte a spustite.
CvGr1.2
Vytvorte okno, na ktorom budú umiestnené dve tlačítka - Buttony a dve textové políčka. Ak stlačíme prvé tlačítko, obsah prvého políčka skopíruje v druhom políčku. Ak stlačíme druhé tlačítko, obsahy jednotlivých textových políčok sa navzájom vymenia.
CvGr1.3
Vytvorte vlastný jednoduchý applet. Napríklad taký, ktorý po stlačení tlačítka začne v textovom políčku odpočítavať sekundy. Zobrazí číslo jedna, po sekunde sa na jeho mieste objaví číslo dva atď. Keď už bude applet funkčný na appletvieweri, umiestnite ho na sieť. Ak nebude fungovať tam, preštudujte si z dostupnej literatúry ako sa balia triedy, patriace do jedného appletu do súboru "jar" a skúste, či bude funkčný v takejto komprimovanej forme. Prezrite si stránku s appletom na rôznych prehliadačoch.
Vaše komentáre:
kupka@fmph.uniba.sk