Image
27.6.2016 0 Comments

Programujeme v Jave /5.časť

Späť na úvod >> Späť na programovanie >> Späť na seriál

Komponenty

V tomto pokračovaní seriálu sa budeme venovať ďalším komponentom poskytovaným knižnicou Swing a udalostiam, ktoré s nimi súvisia. V predchádzajúcej časti ste sa mali možnosť oboznámiť s tlačidlom JButton, ktoré je potomkom AbstractButton. Tentoraz sa budeme venovať okrem iného ďalším jeho potomkom, preto budú mať tieto komponenty veľa spoločného. Takisto sa budeme venovať textovým komponentom.

JCheckBox

JCheckBox je ďalším predstaviteľom potomkov AbstractButton. JCheckBox je jednoduché zaškrtávacie políčko, aké určite poznáte z iných aplikácií alebo webových formulárov. Táto trieda poskytuje viacero konštruktorov, ktoré umožňujú špecifikovať text pridružený k políčku, implicitný stav políčka alebo jeho ikonu. Ich vymenúvaním sa tu nebudeme zaoberať, v tomto vám dostatočne pomôže API referencia k JDK. Používanie JCheckBox je veľmi jednoduché, v podstate sa riadi tými istými pravidlami ako Jbutton, s tým rozdielom, že uchováva aj hodnotu o svojom stave, teda či je zaškrtnuté alebo nezaškrtnuté. Na to, aby sme túto informáciu získali, nám môže poslúžiť metóda isSelected() definovaná v triede AbstractButton. Druhou možnosťou je získať model tlačidla a z neho informáciu o jeho stave, čo je užitočné najmä pri obsluhe udalostí, ako ste to mali možnosti vidieť v predošlej časti. Príklad použitia JCheckBox je uvedený ďalej v tomto článku.

JRadioButton

Komponent JRadioButton je sčasti podobný JCheckBox, s tým rozdielom, že je určený na zoskupovanie viacerých tlačidiel s tým, že vždy môže byť označené iba jedno z nich. Tento komponent vám môže byť známy aj pod názvom prepínač. Na to, aby ste mohli určiť, ktoré tlačidlá patria do jednej skupiny, potrebujete inštanciu triedy ButtonGroup. Po jej vytvorení môžete do tohto kontajnera vkladať potomkov triedy AbstractButton, čo budú najčastejšie práve komponenty JRadioButton. Na vloženie komponentu slúži metóda add(), ktorej ako parameter odovzdáte odkaz na tlačidlo, ktoré chcete do kontajnera vložiť. Rovnaký parameter musíte odovzdať metóde remove(), ktorá slúži na vyňatie tlačidla z kontajnera. Počet tlačidiel v kontajneri môžete získať metódou getButtonCount() a metódou getSelection() získate model označeného tlačidla. Užitočná môže byť aj metóda getElements() vracajúca objekt typu Enumeration obsahujúci odkazy na všetky tlačidlá v kontajneri. Použitie JRadioButton a JCheckBox uvádzam v nasledujúcom príklade:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
public class ButtonTest extends JApplet {
  JRadioButton t1, t2, t3;
  JCheckBox cb;
  JButton b;
 
  public void init() {
    this.setSize(new Dimension(190, 200));
    Container kontajner = getContentPane();
    kontajner.setLayout(new GridLayout(6, 1));
    kontajner.add(new JLabel("Vasa uroven znalosti Javy:"));
 
    ButtonGroup bg = new ButtonGroup();
    t1 = new JRadioButton("zaciatocnik");
    t1.setSelected(true);
    bg.add(t1);
    kontajner.add(t1);
    t2 = new JRadioButton("pokrocily");
    bg.add(t2);
    kontajner.add(t2);
    t3 = new JRadioButton("expert");
    bg.add(t3);
    kontajner.add(t3);
   
    cb = new JCheckBox("Chcem sa naucit o Jave viac", false);
    kontajner.add(cb);
   
    b = new JButton("OK");
    b.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent ae) {
        JRadioButton vybrane = null;
        if (t1.isSelected()) vybrane = t1;
        else if (t2.isSelected()) vybrane = t2;
        else if (t3.isSelected()) vybrane = t3;
        JOptionPane.showMessageDialog(ButtonTest.this,
                                      "V programovani v Jave ste "
                                      + vybrane.getText() +
                                      ", a " + (cb.isSelected() ? "" : "ne")
                                      + "chcete sa naucit viac.",
                                      "Vysledok",
                                      JOptionPane.INFORMATION_MESSAGE);
      }
    });
    kontajner.add(b);
   
  }
 
}

V tomto mini-formulári si môžete vybrať jednu z troch možností ponúkaných prepínačmi a môžete sa rozhodnúť, či zaškrtnete zaškrtávacie políčko. Po kliknutí na tlačidlo OK je zobrazená informácia o hodnotách, ktoré ste zvolili. Tieto informácie sú zobrazené pomocou komponentu JOptionPane, ktorý je pri takýchto situáciách veľmi užitočný. Umožňuje nielen zobrazenie informačného alebo chybového dialógu, ale aj požiadať o používateľský vstup. Máte možnosť špecifikovať, aká ikona má byť zobrazená, aký text, záhlavie a aké tlačidlá má dialóg obsahovať. Pokiaľ chcete zistiť o tomto komponente viac, nahliadnite do API referencie k JDK. Aj v tomto seriáli ho budeme dosť často používať.

Pokiaľ teda zaškrtnete zaškrtávacie políčko, vyberiete druhý prepínač a kliknete na OK.

JTextField

JTextField predstavuje ďalší z vám už určite známych komponentov. Ide o jednoriadkové vstupné textové pole, ktoré umožňuje používateľovi zadať nejakú hodnotu. JTextField je potomkom JTextComponent, od ktorého dedí model založený na architektúre dokument/pohľad, ktorý umožňuje efektívnejšiu manipuláciu s vloženými dátami. Najjednoduchším spôsobom, ako vytvoriť inštanciu triedy JtextField, je odovzdať jej konštruktoru číslo predstavujúce veľkosť textového poľa na šírku, prípadne inicializačný text a veľkosť textového poľa.

Aj keď textové pole umožňuje registráciu poslucháča ActionListener, ktorého metóda actionPerformed() je volaná vtedy, keď používateľ stlačí pri editácii toho poľa kláves Enter, nebudete túto možnosť asi pričasto využívať (ale oplatí sa o nej vedieť). Od svojej rodičovskej triedy JTextComponent dedí možnosť registrácie aj poslucháčov typu CaretListener. Tento poslucháč obsahuje jedinú metódu caretUpdate(), ktorá je volaná pri zmene pozície kurzora. Túto udalosť takisto asi nebudete príliš často potrebovať.

Oveľa užitočnejšími metódami sú tie na kopírovanie, vynímanie a vkladanie textu. Na tieto úkony slúžia metódy copy(), cut() a paste(), definované v triede JTextComponent. Vďaka tomu nemusíte túto funkčnosť v žiadnom textovom poli odvodenom od JTextComponent implementovať vy, všetko za vás spravili už návrhári knižníc Javy. V prípade, že chcete vykonať niektorú z týchto operácií, stačí zavolať príslušnú metódu. Nemusíte však dokonca ani implementovať podporu štandardných klávesových skratiek (ako Ctrl + C, Ctrl + V alebo Ctrl + X), pretože tá je tiež už implementovaná v dodávanej knižnici. V rámci jednej aplikácie je možné kopírovať a vkladať text medzi rôznymi textovými políčkami, ale, bohužiaľ, nie je možné tieto operácie vykonávať medzi rôznymi aplikáciami. Implementácia takejto funkčnosti je už trošku zložitejšia a v tomto seriáli sa jej zatiaľ nebudeme venovať.

Poďme si predviesť použitie textových políčok na príklade. V nasledujúcej ukážke vytvoríme jednoduchý applet obsahujúci dve textové políčka, medzi ktorými je jedno tlačidlo. Políčko vľavo slúži ako zdroj a políčko vpravo ako cieľ. V prípade, že je vybraný nejaký text v zdrojovom políčku a používateľ klikne na tlačidlo, bude tento text vyňatý zo zdroja a vložený do cieľového políčka. Pokiaľ pri tom používateľ podrží kláves Ctrl, bude text iba skopírovaný, teda zostane aj v zdrojovom políčku:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
public class TextTest extends JApplet {
  JTextField zdroj, ciel;
 
  public void init() {
    this.setSize(new Dimension(300, 40));
    Container kontajner = getContentPane();
    kontajner.setLayout(new FlowLayout());
   
    zdroj = new JTextField(10);
    kontajner.add(zdroj);
    JButton tlacidlo = new JButton(">>");
    tlacidlo.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent ae) {
        if (zdroj.getSelectedText() != null) {
          if ((ae.getModifiers() & ActionEvent.CTRL_MASK) != 0) zdroj.copy();
          else zdroj.cut();
          ciel.paste();
        }
      }
    });
    kontajner.add(tlacidlo);
    ciel = new JTextField(10);
    kontajner.add(ciel);
   
  }
 
}

To najdôležitejšie sa nachádza v tele metódy actionPerformed() anonymnej triedy implementujúcej ActionListener rozhranie. V tejto metóde najprv zistíme, či je v zdrojovom políčku označený nejaký text pomocou metódy getSelectedText(). Pokiaľ áno, zistíme, či pri stlačení tlačidla bol stlačený kláves Ctrl, a v závislosti od toho voláme buď metódu cut(), alebo copy() zdrojového tlačidla. Následne zavoláme metódu paste() cieľového tlačidla a tým je celý proces ukončený. Pokiaľ chcete, môžete sa pokúsiť tento applet zmeniť tak, aby po kliknutí na tlačidlo zostal kopírovaný text v zdrojovom tlačidle označený, pretože teraz sa po skopírovaní odznačí. Môžete to spraviť napríklad tak, že si uložíte informáciu o tom, ktorá časť textu bola označená, a po dokončení operácie tento text opäť označíte (pomôžu vám pri tom metódy getSelectionStart() a getSelectionEnd(), resp. setSelectionStart() a setSelectionEnd() triedy JTextComponent).

JPasswordField

Textový komponent JPasswordField je potomkom JTextField a mierne sa od neho líši v tom, že zobrazuje zadávaný vstup iba jedným typom znaku, najčastejšie ide o znak hviezdička (*). Toto je užitočné v prípade, keď chcete, aby používateľ zadal nejaké heslo alebo inú dôvernú informáciu. S takýmto textovým políčkom ste sa už tiež určite niekde na webe stretli.

Použitie tohto textového políčka je veľmi podobné použitiu JTextField, líši sa od neho iba v niektorých detailoch. Obsahuje predefinované metódy cut() a copy(), ktoré pri pokuse o skopírovanie dôverného textu vygenerujú iba chybové pípnutie a žiadanú operáciu neumožnia z bezpečnostných dôvodov. Ďalšia odlišnosť spočíva v tom, že zadaný vstup sa neodporúča získavať metódou getText() (táto metóda je označená ako Deprecated, teda zastaraná – takisto z bezpečnostných dôvodov), ale metódou getPassword(), ktorá vracia pole znakov char obsahujúce zadaný text.

Jednoduchým spôsobom je možné zmeniť znak, ktorý je zobrazený používateľovi pri zadávaní vstupu. Ako som už spomenul, implicitnou hodnotou je znak hviezdičky (*), ale nič vám nebráni v tom, aby ste pomocou metódy setEchoChar(), definovanej v triede JPasswordField, nastavili explicitne, ktorý znak má byť vypisovaný. Momentálne nastavenie môžete získať metódou getEchoChar().

JFormattedTextField

Toto textové pole slúži na zadávanie formátovaného vstupu používateľom. Formátovaným vstupom mám na mysli nejaké obmedzenie zadávaného textu, ako napríklad umožnenie zadávania iba číselných hodnôt a podobne. Na kontrolu správnosti vstupu zadávaného používateľom slúži formátovací objekt, ktorý musí byť inštanciou nejakej triedy odvodenej od triedy Format alebo JFormattedTextField.AbstractFormatter. Vy si môžete, samozrejme, vytvoriť vlastný formátovací objekt, ale v drvivej väčšine prípadov si asi vystačíte s formátmi poskytovanými knižnicami Javy.

Nastaviť formátovanému textovému poľu formátovací objekt môžete pomocou metódy setFormatter() alebo ho môžete odovzdať ako parameter konštruktoru komponentu (prvá možnosť je použiteľná len v prípade, že použijete JFormattedTextField.AbstractFormatter). Pokiaľ chcete použiť inštanciu triedy odvodenej od triedy Format, musíte odkaz na ňu odovzdať konštruktoru komponentu.

Nasledujúci fragment kódu demonštruje použitie inštancie triedy NumberFormat, pomocou ktorej dovolíme používateľovi vkladať iba číselné hodnoty:

 
NumberFormat format = NumberFormat.getInstance();
format.setGroupingUsed(false);
format.setParseIntegerOnly(false);
format.setMaximumFractionDigits(2);
JFormattedTextField ftf = new JFormattedTextField(format);

Po získaní inštancie triedy NumberFormat jej statickou metódou getInstance() sme najprv nastavili požadované správanie sa formátovacieho objektu – metóda setGroupingUsed() nastaví vlastnosť združovania čísel po násobkoch 1000 (teda to, či majú byť čísla vypisované vo formáte „15.156.875,00“ – hodnota true, alebo radšej vo formáte bez bodiek „15156875,00“ – hodnota false). Metóda setParseIntegerOnly() určuje to, či má byť umožnené používateľovi vloženie aj reálneho (hodnota false) alebo iba celého čísla (true). Keďže sme vkladanie reálnych čísel umožnili, zíde sa nastavenie maximálneho počtu číslic za desatinnou čiarkou metódou setMaximumFractionDigits(). Po vytvorení inštancie formátovacieho objektu a nastavení všetkých žiadaných vlastností sme odkaz na túto inštanciu odovzdali ako parameter konštruktoru komponentu JFormattedTextField.

JTextArea

Posledným textovým komponentom, ktorému sa budeme venovať, je JTextArea. Ide opäť o komponent, ktorý už určite dôverne poznáte – je to textové pole umožňujúce zadávanie viacriadkového textu, teda predstavuje akési rozšírenie komponentu JTextField, aj keď v skutočnosti medzi nimi nejde o vzťah rodič – potomok.

Vytvorenie komponentu JTextArea je rovnako jednoduché ako vytvorenie ostatných komponentov, s ktorými sme sa doteraz oboznámili. JTextArea poskytuje viacero preťažených konštruktorov, najčastejšie budete používať pravdepodobne tie, ktorým odovzdávate počet stĺpcov a riadkov, ktoré má textové pole obsahovať, prípadne verziu konštruktora, ktorá prijíma ako prvý parameter ešte inicializačný text. Trieda JTextArea však poskytuje o niečo viac metód, než to bolo pri jednoriadkových textových poliach. Napríklad metódy setRows() a setColumns() umožňujú nastaviť počet riadkov a stĺpcov textového poľa, pričom tento počet stačí zadať ako parameter. Dôležitou metódou je aj setLineWrap(), ktorá ako jediný parameter preberá hodnotu typu boolean, ktorou určíte to, či majú byť slová na konci riadkov zalamované, alebo nie. V prípade, že túto hodnotu nastavíte na true, budú konce riadkov zalamované, ale takým spôsobom, že ak to bude potrebné, bude zalomený text aj v strede slova. Toto správanie býva zväčša nežiaduce, pretože je vhodné, aby bol text zalamovaný iba medzi slovami. To môžete dosiahnuť volaním metódy setWrapStyleWord() s hodnotou true. Text bude zalamovaný vždy iba medzi slovami, v strede slova iba v prípade, že slovo je dlhšie ako celý riadok. Tento postup je demonštrovaný na nasledujúcom príklade (uvádzam len fragment kódu):

    JTextArea ta = new JTextArea("Serial o Jave v PC REVUE", 10, 7);
    ta.setLineWrap(true);
    ta.setWrapStyleWord(true);

Pokiaľ vložíte tento kód do nejakého appletu a pridáte do jeho kontajnera toto textové pole, môžete skúsiť doň zapisovať. Len čo zaplníte všetko miesto vnútri textového poľa, to začne zväčšovať svoju výšku tak, aby vyhovela potrebám vloženého textu. V prípade, že nenastavíte zalamovanie riadkov, bude pole zväčšovať aj svoju šírku. Pre nás by však bolo oveľa vhodnejšie, keby veľkosť komponentu zostávala rovnaká a v prípade, že text nebude možné zobraziť celý, aby bolo možné sa v ňom pohybovať pomocou posuvníkov. To sa dá dosiahnuť zapuzdrením komponentu do inštancie triedy JScrollPane. Táto trieda predstavuje komponent posuvníkov a možno do nej zapuzdriť akýkoľvek komponent. Časom uvidíte, že ide o veľmi užitočnú vlastnosť, a budete JScrollPane využívať pomerne často. My si na záver tohto pokračovania seriálu ukážeme jeho použitie spolu s komponentom JTextArea na nasledujúcom príklade (uvádzam iba metódu init()):

  public void init() {
    this.setSize(new Dimension(250, 150));
    Container kontajner = getContentPane();
    kontajner.setLayout(new FlowLayout());
    JTextArea ta = new JTextArea("Serial o Jave v PC REVUE", 6, 20);
    ta.setLineWrap(true);
    ta.setWrapStyleWord(true);
    JScrollPane jsp = new JScrollPane(ta);
    kontajner.add(jsp);
   
  }

Ako vidíte, použitie JScrollPane je naozaj jednoduché. Stačí pri konštrukcii objektu odovzdať ako parameter odkaz na komponent, ktorý chcete zapuzdriť (v našom prípade JTextArea), a následne do kontajnera pridať odkaz na inštanciu JScrollPane namiesto odkazu na konkrétny komponent. 

Záver

Po tejto časti už poznáte väčšinu využiteľných tlačidlových a textových komponentov. Je dobré si prejsť dokumentáciu a zistiť, čo všetko ešte tieto komponenty umožňujú. V nasledujúcej časti sa budeme venovať trošku zložitejším komponentom.

 

 

Autor: Andrej Chu

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

ITPro

Linux súkromne i pracovne v2.0 (14. časť): Small Business Server

09.11.2016 14:57

Pojem Small Business Server (malý firemný server) začala používať spoločnosť Microsoft ešte v roku 2000 na označenie servera, ktorý ­dokázal plniť úlohy niekoľkých samostatných serverov. Aplikačná vrs ...

ITPro

Industry 4.0: Fikcia alebo už realita?

09.11.2016 14:52

Štvrtá priemyselná revolúcia je pomenovanie rozsiahlych zmien prudko vstupujúcich do súčasného priemyslu. Nositeľom týchto zmien je digitalizácia výroby a optimalizácia všetkých podnikových procesov v ...

ITPro

Vývoj aplikácií UWP pre Xbox One II.

09.11.2016 14:47

V predošlej časti sme ukázali postup, ako si ­vytvoriť vývojársky účet a aktivovať vývojársky režim na hernej konzole Xbox One, aby ste mohli testovať svoje aplikácie. Výhodou hernej konzoly Xbox je v ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá