Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

ItemListener v Jave

Rozhranie ItemListener odchytáva udalosť za použitia metódy itemStateChanged (), generovanú komponentom JCheckBox a JRadioButton.

JCheckBox

Je zaškrtávacie pole, ktoré môže nadobúdať logické hodnoty true / false. Zaškrtávať môžeme viac checkbox zároveň. konštruktor:

  • JCheckBox checkbox = new JCheckBox (); - bez popisku a bez začiarknutie.
  • JCheckBox checkbox = new JCheckBox (String popis, Boolean stav); - s popisom. Pokiaľ bude stav nadobúdať hodnoty true, tak bude políčko zaškrtnuté.

metódy:

  • isSelected (); - metóda, ktorá vracia hodnotu true, ak je políčko označené a false ak nie.
  • gettext (); - získanie popisku checkbox.
  • setText (String text); - nastavenie popisku checkbox.
  • setSelected (boolean stav) - nastavuje stav checkbox.
  • getItemSelectable (); - vráti aktuálne aktivovanej poľa.

JRadioButton

Komponent podobná checkbox, ale má okrúhly tvar a v skupine RadioButton môže byť zaškrtnutý iba jeden. RadioButton môžeme vložiť do skupiny zvanej JButtonGroup. Ak vyberieme (aktivujeme) jeden z RadioButton tak nebudeme môcť vybrať žiadny z ostatných. K tomuto účelu slúžia prevažne trieda ButtonGroup, ktorá všetky tlačidlá vnútorne kontroluje. konštruktor:

  • JRadioButton RadioButton = new JRadioButton (); - bez popisku a bez zaškrtnutie
  • JRadioButton RadioButton = new JRadioButton (String text, Boolean stav); - vytvorí políčko s popiskom a ak bude uvedená hodnota true, tak i zaškrtnuté.

metódy:

  • isSelected () - metóda ktorá vracia hodnotu true, ak je políčko označené a false ak nie.
  • setSelected () - nastaví stav tlačidla
  • add (AbstractButton b) - pridá tlačidlo do skupiny
  • remove () - odstráni tlačidlo zo skupiny
  • getButtonCount () - vráti počet komponentov v skupine

Konštruktor triedy ButtonGroup: ButtonGroup buttonGroup = new ButtonGroup ();

Praktická ukážka

Vytvoríme si novú triedu MyFrame, ktoré nastavíme konštruktor a statickú metódu createWindow, ktorá vyrvoří hlavné okno našej aplikácie.

package udalosti;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.ItemSelectable;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

public final class MyFrame extends JFrame{
    Container pane;
    JCheckBox first_checkBox, second_checkBox;
    JRadioButton blue_button, red_button;
    JPanel topPanel, centerPanel, colorPanel;
    ButtonGroup bg;

   public MyFrame(){
     setSize(500,500);
     setTitle("ItemListenerDemo");
     pane = this.getContentPane();
     pane.setLayout(new BorderLayout());
     topPanel = new JPanel();
     topPanel.setLayout(new FlowLayout());
     centerPanel = new JPanel();
     centerPanel.setLayout(new FlowLayout());
     setComponents();
     setListeners();
   }

   public static Frame createWindow(){
       MyFrame mf = new MyFrame();
       mf.setLocationRelativeTo(null);
       mf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       mf.setResizable(false);
       mf.setVisible(true);
       return mf;
   }

}

Tak v triede MyFrame sme definovali 3 panelmi. Prvý hlavný panel (pán) má nastavený BorderLayout. Druhý a tretí panel majú nastavený FlowLayout. Do týchto panelov budeme za chvíľu vkladať JRadioButtony a JCheckButtony. Dúfam že je jasné že (top_panel a centerPanel) sú súčasťou hlavného panela pane. Nakoniec nesmieme zabudnúť na colorPanel, ktorý slúži len ako prázdny panel meniace farbu podľa nastavenia RadionButtonů. V konstruktoru potom voláme metódy setComponents () a setListeners (), ktoré si teraz vytvoríme.

Do triedy MyFrame si pridajte za konštruktor nasledujúce kus kódu:

public void setComponents(){
     first_checkBox = new JCheckBox("First Button");
     second_checkBox = new JCheckBox("Second Button");
     bg = new ButtonGroup();
     blue_button = new JRadioButton("blue panel");
     red_button = new JRadioButton("red panel");
     colorPanel = new JPanel();
     colorPanel.setBackground(Color.BLACK);

     bg.add(red_button);
     bg.add(blue_button);

     topPanel.add(first_checkBox);
     topPanel.add(second_checkBox);
     centerPanel.add(blue_button);
     centerPanel.add(red_button);

     pane.add(topPanel, BorderLayout.PAGE_START);
     pane.add(centerPanel, BorderLayout.CENTER);
     pane.add(colorPanel, BorderLayout.PAGE_END);
   }

V tejto metóde vytvárame grafickú stránku nášho programu. Nie je tu nič moc nové, ale pre istotu zdôrazním, že objekt triedy ButtonGroup nemôžeme pridať do nášho panela (centerPanel). Táto trieda, ako sem už spomenul, iba kontroluje RadioButton a zabezpečuje, aby bol aktívny vždy iba jeden (vykonáva vnútornú kontrolu). Do panelu (centerPanel) potom pridáme iba jednotlivé tlačidlá.

Ďalšou zaujímavou metódou je setListeners, ktorú som schválne urobil tak, aby nastavovala udalosti odlišným spôsobom. Chcem vám je ukázať hlavne kvôli tomu, aby ste nemali problém orientovať sa v cudzom kódu. Keď narazíte na rôzne typy zápisu, môže vás to zmiasť. Takto to aspoň budete poznať a len tak vás to nerozhádže. Tak a samotná metóda setListeners:

V triede MyFrame si pridajte za metódu setKomponents nasledujúce kus kódu:

public void setListeners(){
     first_checkBox.addItemListener(new MyItemClass());
     second_checkBox.addItemListener(new MyItemClass());

     blue_button.addItemListener(new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
             colorPanel.setBackground(Color.BLUE);
          }
       }
    );


    red_button.addItemListener(new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
             colorPanel.setBackground(Color.RED);
          }
       }
    );
   }

Tak ako som hovoril. RadioButtonům som nastavil udalosť vnútorne priamo v metóde setListeners () a komponenty CheckButton budú volať triedu MyItemClass.

Tak teraz si len si v triede MyFrame vytvoríme vnorenú triedu MyItemClass:

public class MyItemClass implements ItemListener{
   @Override
   public void itemStateChanged(ItemEvent e) {
       ItemSelectable selection = e.getItemSelectable();
        if(selection == first_checkBox){
            if(first_checkBox.isSelected()){
              first_checkBox.setText("active");
            }
            else{
              first_checkBox.setText("inactive");
            }
        }
        else if(selection == second_checkBox){
           if(second_checkBox.isSelected()){
              second_checkBox.setText("active");
            }
            else{
              second_checkBox.setText("inactive");
            }
        }
    }
  }

Do premennej triedy ItemSelectable si uložíme práve stlačené tlačidlo a pomocou operátora == môžeme porovnať ktorý CheckButton bol aktivovaný. Potom využijeme metódu isSelected () a zistíme, či je hodnota poľa true alebo false a podľa toho vykonáme potrebný príkaz.

Program ako vždy bude spúšťať trieda Štart:

package udalosti;

public class Start {
    public static void main(String args[]){
        MyFrame.createWindow();
    }
}

Tak a náš nový program môžete vyskúšať sami.


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 182x (1.13 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Všetky články v sekcii
Java Swing bez grafického návrhára
Článok pre vás napísal Milan Gallas
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje programování, hardwaru a počítačovým sítím.
Aktivity