JComboBox a dialogy v Java Swing

Java Swing Swing bez grafického návrháře JComboBox a dialogy v Java Swing

JComboBox

Co to vlastně je? JComboBox je jednoduchý rozbalovací setříděný seznam, který na první pohled zobrazuje pouze jednu položku. Po kliknutí na postranní šípku se seznam rozbalí a jsou vidět všechny položky výběru, na které poté můžete kliknout a vybrat jednu z možností (položek seznamu).

Výhody: Komponenta rozhodně šetří místo stejně jako MenuBar. Položky v ComboBoxu jsou číslované a dá se k nim přistupovat pomocí indexů. Položky lze přidávat i za běhu programu.

Nejčastěji používané metody:

  1. addItem(položka) - přidá položku do seznamu na poslední pozici
  2. insertItem(položka, int pozice) - přidá položku do seznamu na Vámi zvolenou pozici
  3. getSelectedItem() - získání označené položky seznamu
  4. getSelectedIndex() - získání indexu označené položky seznamu
  5. removeAllItems() - smaže všechny položky seznamu
  6. removeItemAt(int pozice) - smaže položku na dané pozici
  7. getItemCount() - vrátí počet položek seznamu

Příklad

Náš úkol bude jednoduchý. Prostě vytvoříme 6 ComboBoxů, do kterých uložíme čísla v rozmezí -9 až 9. První tři ComboBoxy budou označovat Vektor a1 a zbylé tři budou označovat vektor a2. Po stisknutí tlačítka sečteme oba vektory a výsledek(výsledný vektor d) si vypíšeme pomocí dialogu, který si poté popíšeme.

Nejprve si vytvoříme třídu MyFrame, sepíšeme komponenty které budeme používat a konstruktor:

import java.awt.Container;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class MyFrame extends JFrame
{
        private Container pane;
        private JComboBox x1, y1, z1, x2, y2, z2;
        private JButton secti;
        private int x,y,z;
        private JLabel a1, a2;
        private JPanel prvniVektor, druhyVektor;

        public MyFrame()
        {
                this.setSize(300, 200);
                this.setTitle("použití Comboboxů");
                pane = this.getContentPane();
                pane.setLayout(new BoxLayout(pane,BoxLayout.PAGE_AXIS));
                nastavKomponenty();
                nastavListenery();
        }
}

Začnu u použitých komponent. Nastavili jsme 6 ComboBoxů, tlačítko nám poslouží při vytvoření události. Dále jsme vytvořili 3 čísla (x,y,z), které použijeme při výpočtu našeho výsledného vektoru d. Potom zde máme 2 popisky a dva panely do kterých poté uložíme KomboBoxy.

V konstruktoru jsme si nastavili výšku a šířku okna, popisek a hlavní panel, kterému jsme nastavili BoxLayout s parametrem(PA­GE_AXIS). To samozřejmě znamená že se komponenty budou řadit v okně pod sebe. Dále jsme nastavili volání 2 metod, které si teprve vytvoříme.

Za náš konstruktor si přidejte následující kus kódu:

public void nastavKomponenty() {
        prvniVektor = new JPanel();
        druhyVektor = new JPanel();
        x1 = new JComboBox();
        y1 = new JComboBox();
        z1 = new JComboBox();
        x2 = new JComboBox();
        y2 = new JComboBox();
        z2 = new JComboBox();
        for(int i = -9; i<10; i++) {
                x1.addItem(i);
                y1.addItem(i);
                z1.addItem(i);
                x2.addItem(i);
                y2.addItem(i);
                z2.addItem(i);
        }
        a1 = new JLabel("Vektro a1");
        a2 = new JLabel("Vektor a2");
        secti = new JButton("vypočti vektor D");

        prvniVektor.add(x1);
        prvniVektor.add(y1);
        prvniVektor.add(z1);
        druhyVektor.add(x2);
        druhyVektor.add(y2);
        druhyVektor.add(z2);

        pane.add(a1);
        pane.add(prvniVektor);
        pane.add(a2);
        pane.add(druhyVektor);
        pane.add(secti);
}

Podle názvu jste již jistě pochopili, že tato metoda nastavuje komponenty :). Nastavení panelů je vám zřejmě jasné. Zaměřím se proto na následující část kódu:

x1 = new JComboBox();

Tento kód vytváří pouze prázdný ComboBox a poté musíme čísla přidat až v cyklu for. Říkáte si že by bylo lepší vytvořit pole int[], které by jsme přidali už v konstruktoru. No, on je tu jeden problém. Konstruktor JComboBoxu nesmí mít jako parametr pole int[]. Program by prostě vyhodil chybu, proto čísla přidávám až v cyklu. Čísla se dají samozřejmě přidat jako pole String[]. Ono je to prakticky jedno, šlo by obojí.

Nastavení události

Za metodu na nastavKomponenty(), si vložte následující kód:

public void nastavListenery() {
        secti.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e){
                        x = (int)x1.getSelectedItem() + (int)x2.getSelectedItem();
                        y = (int)y1.getSelectedItem() + (int)y2.getSelectedItem();
                        z = (int)z1.getSelectedItem() + (int)z2.getSelectedItem();
                        JOptionPane.showMessageDialog(pane,"Výpočet vektoru d:\n"
               +"d = ("+x+","+y+","+z+")");
                        }
                }
        );
}

Po stisknutí tlačítka se vyvolá výše popsaný kód. Použijeme naše proměnné x, y, z k výpočtu našeho vektroru d.

Výpočet je jednoduchý. Malý příklad:

Jsou dány vektory:

  • a1 = (3, 2, -1)
  • a2 = (-2, 6, -9)

určete d) a1 + a2

d = (3, 2, -1) + (-2, 6, -9) -> 3-2, 2+6, -1-9 -> (1, 8, -10)

U čísel si dále můžete všimnou, že stejně musíme použít přetypování na celočíselný datový typ pomocí příkazu (int). Proto jak sem již zmiňoval by nevadilo, kdybychom čísla přidaly jako pole String[].

Výsledek si zobrazíme pomocí dialogu. Slouží k tomu metoda .showMessageDi­alog(panel, "text"); Dialogy si po skončení tohoto příkladu popíšeme.

Teď jen přidáme za metodu nastavListenery() statickou metodu, která nám nastaví okno našeho programu. přidejte tedy následující kód:

public static Frame nastav() {
        MyFrame myframe = new MyFrame();
        myframe.setLocationRelativeTo(null);
        myframe.setVisible(true);
        return myframe;
}

Třídu MyFrame máme tedy hotovou. Teď jenom vytvoříme třídu Start, která nám okno vytvoří a spustí celý program přes metodu main.

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

Příklad si samozřejmě můžete stáhnout.

Dialogy

Jsou to vlastně vyskakovací okna, která uživatele na něco upozorní, něco mu zobrazí, nebo se můžeme uživatele na něco zeptat a reagovat na jeho odpověď.

Metoda pro zobrazení oznamovacího dialogu vypadá následovně:

JOptionPane.show­MessageDialog(pa­nel, "text"); - tento dialog používá základní nastavení.

  • panel = určuje panel ve kterém se má dialog zobrazit.

Můžeme náš dialog definovat přesněji.

JOptionPane.showMessageDialog(panel, "text", "titulek", param);

param:

  • JOptionPane.WAR­NING_MESSAGE - Výstražné okno
  • JOptionPane.ER­ROR_MESSAGE - Chybové okno
  • JOptionPane.PLA­IN_MESSAGE - okno bez ikony

Můžete také vytvořit vlastní dialog s vlastní ikonou a přidat ji do našeho okna:

JOptionPane.showMessageDialog(panel, "Váš text", "titulek", JOptionPane.INFORMATION_MESSAGE, Icon icon);

Poslední zmíněné je informační okno. To jsou dialogy které uživatele informují, nebo upozorňují na nějakou událost tzv. MessageDialog.

Teď si předvedeme tzv. OptionDialog.

showOptionDialog(panel, "text", "titulek", typ tlačítek , typ zprávy, Icon icon);

typ tlačítek:

  • OK_OPTION - tlačítko ok (potvrdit)
  • OK_CANCEL_OPTION - tlačítka ok a cancel (potvrdit, zrušit)
  • NO_OPTION - tlačítko no (odmítnout)
  • YES_OPTION - tlačítno yes (ano);
  • CANCEL_OPTION - tlačítko cancel (zrušit)
  • YES_NO_OPTION - tlačitka yes, no (ano, ne);
  • YES_NO_CANCEL_OP­TION - tlačítka yes, no, cancel

typ zprávy - QUESTION_MESSAGE. Celým zápisem - JOptionPane.QU­ESTION_MESSAGE

Komu by to nestačilo, tak tady je celé volání:

showOptionDialog(panel, "text", "titulek", typ , int Type, Icon icon, Object[] popisky,
Object komponenty);

Poslední parametr určuje komponenty, které můžete použít například použití ProgressBaru. Uvedu malý příklad použití OptionDialogu.

Container pane = this.GetContentPane();
pane.setLayout(new FlowLayout());
String[] nastaveni = {"potvrzuji","zrušit!!"};
int s = JOptionPane.showOptionDialog(pane, "Přijímáte můj pozdrav?",
"Otázka",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE, null,
nastaveni, nastaveni[1]);

Výsledek vidíte sami:

Java dialog – Otázka

Odpověď můžeme samozřejmě zjistit pomocí následujícího kódu:

if (s==JOptionPane.OK_OPTION)
{
//bylo stisknuto tlačítko OK
}
else{
//nebylo stisknuto tlačítko OK, nýbrž bylo stisknuto tlačítko CANCEL.
}

Tak to je pro dnešek vše, loučím se s Vámi a těším se na další shledání u dalšího pokračování seriálu Okenní aplikace v Javě.


 

Stáhnout

Staženo 194x (1.33 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 (3 hlasů) :
3.333333.333333.33333 3.333333.33333


 


Miniatura
Předchozí článek
Layouty v Javě (podruhé)
Miniatura
Všechny články v sekci
Java Swing bez grafického návrháře
Miniatura
Následující článek
MenuBar a práce s komponenty

 

 

Komentáře

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Tenhle článek je znatelně lepší oproti ostatním. Mám ale pocit, že máš problém s OOP, např. showMessageDialog není konstruktor, ale metoda (opravil jsem to).

Odpovědět 23.8.2013 12:45
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Tomhaus
Člen
Avatar
Tomhaus:

ahojte mám problém, když nastavim setResizable na true, tak po změnění velikosti okna se mi ten JComboBox ukáže, ale když dam setResizable na false, tak se tam ani neukáže :( pls poraďte někdo

Odpovědět 17.7.2014 11:47
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Tomhaus
Člen
Avatar
Odpovídá na Tomhaus
Tomhaus:

prosím poraďte mi :(

Odpovědět 20.7.2014 18:23
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Tomhaus
Člen
Avatar
Tomhaus:

nechtěj se mi zobrazovat JComboBox-y, jenom když změnim velikost okna.

Odpovědět 30.7.2014 13:43
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Milan Gallas
Redaktor
Avatar
Odpovídá na Tomhaus
Milan Gallas:

Teď jsem to zkoušel a šlo to v pohodě. Stáhni si zdrojový kód a porovnej.

 
Odpovědět 30.7.2014 21:23
Avatar
Tomhaus
Člen
Avatar
Tomhaus:

já to píšu v eclipsu a ten ukázkovej kód mi eclipse nechce přehrát, jenom ukázat.

dam ti sem můj kód:

package MujPokus;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Frame extends JFrame {
        private static final long serialVersionUID = 1L;

        private static final int WIDTH = 450, HEIGHT = 220;

        private JPanel panel01, panel02, panel03;
        private JLabel label01, label02, label03;
        @SuppressWarnings("rawtypes")
        private JComboBox box01, box02;
        private JButton but01;

        public Frame(){
                Container pane = this.getContentPane();
                pane.setLayout(new BoxLayout(pane, BoxLayout.PAGE_AXIS));

                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                setTitle("Pokus");
                setResizable(false);
                setPreferredSize(new Dimension(WIDTH, HEIGHT));
                setLocationRelativeTo(null);
                setVisible(true);

                pack();

                initComponents();
        }

        public static void main(String[] Args){
                new Frame();
        }

        @SuppressWarnings({ "unchecked", "rawtypes" })
        public void initComponents(){
                panel01 = new JPanel();                                                         // nadpis
                panel01.setBackground(Color.GREEN);
                add(panel01);

                panel02 = new JPanel();                                                         // výběr
                panel02.setBackground(Color.RED);
                add(panel02);

                panel03 = new JPanel();                                                         // ukončení
                panel03.setBackground(Color.BLUE);
                add(panel03);

                label01 = new JLabel();
                label01.setText("Ahoj.");
                panel01.add(label01);

                label02 = new JLabel();
                label02.setText("Zvol první: ");
                panel02.add(label02);

                box01 = new JComboBox();
                box01.addItem("A");
                box01.addItem("B");
                box01.addItem("C");
                box01.setPreferredSize(new Dimension(70, 20));
                panel02.add(box01);

                label03 = new JLabel();
                label03.setText("Zvol druhé: ");
                panel03.add(label03);

                box02 = new JComboBox();
                for(int i = 1; i <=7; i++){
                        box02.addItem(i);
                }
                box02.setPreferredSize(new Dimension(60, 20));
                panel03.add(box02);

                but01 = new JButton("Začni");
                add(but01);
        }
}
Editováno 3.8.2014 21:19
Odpovědět 3.8.2014 21:18
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Milan Gallas
Redaktor
Avatar
Odpovídá na Tomhaus
Milan Gallas:

příkaz

setVisible(true);

Dej až úplně na konec.

 
Odpovědět 6.8.2014 21:21
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.

Zobrazeno 7 zpráv z 7.