ItemListener v Javě

Java Swing Swing bez grafického návrháře ItemListener v Javě

Rozhraní ItemListener odchytává událost za použití metody itemStateChan­ged(), generovanou komponentou JCheckBox a JRadioButton.

JCheckBox

Je zaškrtávací pole, které může nabývat logické hodnoty true/false. Zaškrtávat můžeme více CheckBoxů zároveň. Konstruktor:

  • JCheckBox checkBox = new JCheckBox(); - bez popisku a bez zaškrtnutí.
  • JCheckBox checkBox = new JCheckBox(String popis, Boolean stav); - s popiskem. Pokud bude stav nabývat hodnoty true, tak bude políčko zaškrtnuté.

Metody:

  • isSelected(); - metoda, která vrací hodnotu true, pokud je políčko zaškrtnuté a false pokud ne.
  • getText(); - získání popisku CheckBoxu.
  • setText(String text); - nastavení popisku CheckBoxu.
  • setSelected(bo­olean stav) - nastavuje stav CheckBoxu.
  • getItemSelecta­ble(); - vrátí aktuálně zaktivované pole.

JRadioButton

Komponenta podobná CheckBoxu, ale má kulatý tvar a ve skupině RadioButtonů může být zaškrtnutý pouze jeden. RadioButtony můžeme vložit do skupiny zvané JButtonGroup. Pokud vybereme(akti­vujeme) jeden z RadioButtonů tak nebudeme moci vybrat žádný z ostatních. K tomuto účelu slouží převážně třída ButtonGroup, která všechny tlačítka vnitřně kontroluje. Konstruktor:

  • JRadioButton radioButton = new JRadioButton(); - bez popisku a bez zaškrtnutí
  • JRadioButton radioButton = new JRadioButton(String text, Boolean stav); - vytvoří políčko s popiskem a pokud bude uvedená hodnota true, tak i zaškrtnuté.

Metody:

  • isSelected() - metoda která vrací hodnotu true, pokud je políčko zaškrtnuté a false pokud ne.
  • setSelected() - nastaví stav tlačítka
  • add(AbstractButton b) - přidá tlačítko do skupiny
  • remove() - odstraní tlačítko ze skupiny
  • getButtonCount() - vrátí počet komponent ve skupině

Konstruktor třídy ButtonGroup: ButtonGroup buttonGroup = new ButtonGroup();

Praktická ukázka

Vytvoříme si novou třídu MyFrame, které nastavíme konstruktor a statickou metodu createWindow, která vyrvoří hlavní okno naší aplikace.

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 ve třídě MyFrame jsme definovali 3 panely. První hlavní panel(pane) má nastavený BorderLayout. Druhý a třetí panel mají nastavený FlowLayout. Do těchto panelů budeme za chvíli vkládat JRadioButtony a JCheckButtony. Doufám že je jasné že (top_panel a centerPanel) jsou součástí hlavního panelu pane. Nakonec nesmíme zapomenout na colorPanel, který slouží pouze jako prázdný panel měnící barvu dle nastavení RadionButtonů. V konstruktoru pak voláme metody setComponents() a setListeners(), které si teď vytvoříme.

Do třídy MyFrame si přidejte za konstruktor následující 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 této metodě vytváříme grafickou stránku našeho programu. Není tu nic moc nového, ale pro jistotu zdůrazním, že objekt třídy ButtonGroup nemůžeme přidat do našeho panelu(center­Panel). Tato třída, jak sem již zmínil, pouze kontroluje RadioButtony a zajišťuje, aby byl aktivní vždy jen jeden (provádí vnitřní kontrolu). Do panelu(centerPanel) pak přidáme pouze jednotlivá tlačítka.

Další zajímavou metodou je setListeners, kterou jsem schválně udělal tak, aby nastavovala události odlišným způsobem. Chci vám je ukázat hlavně kvůli tomu, aby jste neměli problém orientovat se v cizím kódu. Když narazíte na různé typy zápisu, může vás to zmást. Takhle to aspoň budete znát a jen tak vás to nerozhází. Tak a samotná metoda setListeners:

Ve třídě MyFrame si přidejte za metodu setKomponents následující 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 jak jsem říkal. RadioButtonům jsem nastavil událost vnitřně přímo v metodě setListeners() a komponenty CheckButton budou volat třídu MyItemClass.

Tak teď si jen si ve třídě MyFrame vytvoříme vnořenou třídu 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 proměnné třídy ItemSelectable si uložíme právě stisknuté tlačítko a pomocí operátoru == můžeme porovnat který CheckButton byl zaktivován. Poté využijeme metodu isSelected() a zjistíme, jestli je hodnota pole true nebo false a podle toho vykonáme potřebný příkaz.

Program jako vždy bude spouštět třída Start:

package udalosti;

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

Tak a náš nový program můžete vyzkoušet sami.


 

Stáhnout

Staženo 152x (1.13 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

  Aktivity (1)

Článek pro vás napsal Milan Gallas
Avatar
Autor se věnuje programování, hardwaru a počítačovým sítím.

Jak se ti líbí článek?
Celkem (1 hlasů) :
55555


 


Miniatura
Předchozí článek
MenuBar a práce s komponenty
Miniatura
Všechny články v sekci
Java Swing bez grafického návrháře

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!