autor: Ivan Kupka

Verzia 1

home uvod K1 K2 K3 K4 K5 K6 K7 K8 K9 K10 K11 K12 K13 K14

 

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. 

 

Swing a AWT

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.

 

Zobrazenie komponenty

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.

 

Kód GR1.1

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.

 

Kód GR1.2Pokusny

 

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.

 

 

Cvičenia

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.

 

 

home uvod K1 K2 K3 K4 K5 K6 K7 K8 K9 K10 K11 K12 K13 K14

Vaše komentáre: kupka@fmph.uniba.sk