2. díl - Java GUI - Základní komponenty

Java Swing Swing bez grafického návrháře Java GUI - Základní komponenty

V minulém díle jsme si vytvořili naše první okno v Javě. Nakonec jsem se rozhodl, že budu přidávat jednoduché prográmky, na kterých si vždy něco ukážeme. V následujících dvou dílech si vytvoříme jednoduchou kalkulačku. Dnes si přidáme nějaké komponenty a v příštím tutoriálu se vrhneme na událost. Kalkulačka bude mít jednu funkci a to sčítání. Bude obsahovat dvě textová pole, do kterých budeme zapisovat, tlačítko a label („štítek“), který bude vypisovat výsledek. Pojďme na to. :-)

Vše, co jsme vytvořili v minulém díle, budeme potřebovat. Otevřeme si třídu Gui. Deklarujeme v ní tyto objekty, ke kterým přidáme klíčové slovo private (budou tedy přístupné pouze uvnitř třídy). V konstruktoru třídy Gui je vytvoříme takto:

public class Gui extends JFrame{
    private JLabel vysledekLab;
    private JButton sectiBut;
    private JTextField cislo1Field;
    private JTextField cislo2Field;
    public Gui()
    {
       super("Kalkulačka");
       cislo1Field = new JTextField("1. číslo", 5);
       cislo2Field = new JTextField("2. číslo", 5);
       sectiBut = new JButton("Sečti");
       vysledekLab = new JLabel("Výsledek je: ");
    }

Všechny komponenty jsou objekty, to znamená, že mají své metody a při vytvoření se zavolá konstruktor.

První komponenty

JLabel je obyčejný štítek, do kterého můžeme umístit text – vysledekLab je jméno našeho labelu. Jako parametr přebírá nějaký řetězec (text).

JLabel nazevLabelu = new JLabel("Text na Labelu")

JTextField je pole pro zápis. My jsme si ho pojmenovali cislo1Field (pole pro první číslo). První jeho parametr je text, který se v něm objeví. Číslo za ním vyjadřuje velikost pole. Říká, že bude velké na 5 znaků.

JTextField nazevTextFieldu = new JTextField("Text v TextFieldu", 5)

JButton je obyčejné tlačítko. My jsme ho pojmenovali sectiBut. Parametrem je text, který má být na tlačítku.

JButton nazevTlacitka = new JButton("Text na tlačítku")

Pokud bychom teď spustili program, pořád by měl podobu prázdného okna. Zapomněli jsme na dvě důležité věci.

  • První je tzv. Layout neboli rozmístění komponent v okně. Java má osm layoutů. Podrobně se na ně podíváme jindy. Nám nyní bude stačit FlowLayout. FlowLayout všechno centruje a umísťuje od shora.
FlowLayout layout = new FlowLayout();
setLayout(layout);
  • Druhou věcí je ta, že musíme tyto komponenty do okna přidat. To dělá metoda add(), která jako parametr bere název objektu. Náš kód bude nyní vypadat takto.
public class Gui extends JFrame{

    private JLabel vysledekLab;
    private JButton sectiBut;
    private JTextField cislo1Field;
    private JTextField cislo2Field;

    public Gui()
    {
       super("Kalkulačka");
       FlowLayout layout = new FlowLayout();
       setLayout(layout);

       cislo1Field = new JTextField("1. číslo", 5);
       add(cislo1Field);

       cislo2Field = new JTextField("2. číslo", 5);
       add(cislo2Field);

       sectiBut = new JButton("Sečti");
       add(sectiBut);

       vysledekLab = new JLabel("Výsledek je: ");
       add(vysledekLab);
    }

Jelikož není dobré přidávat komponenty přímo do okna, vytvoříme tzv. JPanel. Jedná se o panel, do kterého se umísťují další komponenty. Drží nám je v podstatě pohromadě. Pro ukázku vytvoříme dva, pojmenujeme je třeba panel1 a panel2.

JPanel nazevPanelu = new JPanel()

Panely mají metodu add(), která jako parametr přebírá komponent, který v ní mají být umístěné. Kód tedy vypadá takhle:

public class Gui extends JFrame{

    private JLabel vysledekLab;
    private JButton sectiBut;
    private JTextField cislo1Field;
    private JTextField cislo2Field;
    private JPanel panel1;
    private JPanel panel2;

    public Gui()
    {
        super("Kalkulačka");
        FlowLayout layout = new FlowLayout();
        setLayout(layout);

        panel1 = new JPanel();
        add(panel1);

        panel2 = new JPanel();
        add(panel2);

        cislo1Field = new JTextField("1. číslo", 5);
        panel1.add(cislo1Field);

        cislo2Field = new JTextField("2. číslo", 5);
        panel1.add(cislo2Field);

        sectiBut = new JButton("Sečti");
        panel1.add(sectiBut);

        vysledekLab = new JLabel("Výsledek je ");
        panel2.add(vysledekLab);
    }

Vidíme, že pokud okno zmenšujeme, drží komponenty v témže panelu pohromadě.

Ukážeme si ještě poslední věc a to jak přidat panelu barvu. Jedná se o metodu setBackground() s parametrem barvy. Například "Color.red" – tedy červené. Můžeme si také pomocí RGB nadefinovat vlastní barvu. Vytvoříme tedy instanci třídy Color (naši barvu), která jako parametry bere hodnoty RGB:

Color nazevBarvy = new Color(150, 75, 130)

Výsledný kód teď vypadá takto:

public class Gui extends JFrame{

    private JLabel vysledekLab;
    private JButton sectiBut;
    private JTextField cislo1Field;
    private JTextField cislo2Field;
    private JPanel panel1;
    private JPanel panel2;

    public Gui()
    {
        super("Kalkulačka");
        FlowLayout layout = new FlowLayout();
        setLayout(layout);

        Color barva = new Color(150, 75, 130);

        panel1 = new JPanel();
        panel1.setBackground(Color.red);
        add(panel1);

        panel2 = new JPanel();
        panel2.setBackground(barva);
        add(panel2);

        cislo1Field = new JTextField("1. číslo", 5);
        panel1.add(cislo1Field);

        cislo2Field = new JTextField("2. číslo", 5);
        panel1.add(cislo2Field);

        sectiBut = new JButton("Sečti");
        panel1.add(sectiBut);

        vysledekLab = new JLabel("Výsledek je ");
        panel2.add(vysledekLab);
    }

Obsah metody main necháme stejný. Ukážu ještě jednu zajímavou metodu. Když chceme mít velikost okna přesně na komponenty, které v ní máme, můžeme použít metodu pack() na našem objektu okno. Takto tedy bude vypadat metoda main:

public static void main(String[] args) {
    Gui okno = new Gui();
    okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    okno.setVisible(true);
    okno.pack();
    okno.setLocationRelativeTo(null);

}

Výsledek vypadá nějak takhle:

kalkulacka1

To je pro dnešek všechno. Příště si řekneme něco o událostech v Javě a "přinutíme" naši kalkulačku, aby sčítala. :-)


 

Stáhnout

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

 

  Aktivity (1)

Článek pro vás napsal Samik11
Avatar
Autor se věnuje primárně programování v jazyce Java. Nestraní se ani C# nebo PHP.

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


 


Miniatura
Předchozí článek
Java GUI
Miniatura
Všechny články v sekci
Java Swing bez grafického návrháře
Miniatura
Následující článek
Java GUI - událost

 

 

Komentáře

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

Super, díky za další díl :) Začal jsem psát něco podobného pro C#: http://www.itnetwork.cz/…indows-forms

Odpovědět 16.1.2013 11:30
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
Inkassso
Člen
Avatar
Inkassso:

V Javě jsem nový a nejspíš je ještě trochu moc brzo na to, abych začal s grafickým rozhraním, ale nedalo mi to a musel jsem to zkusit.
Návod je výborný, jen jsem musel u třídy Gui naimportovat java.awt.*, protože mi to házelo chybu u FlowLayout a Color...

Editováno 16.1.2013 18:27
 
Odpovědět 16.1.2013 18:26
Avatar
Samik11
Redaktor
Avatar
Samik11:

Jojo, to jsem zapomněl zmínit. :) Na druhou stranu pokud už člověk něco napsal, tak mu to dojde, když ho IDE upozorní....

Odpovědět 16.1.2013 18:31
„Radost vidět a rozumět, to je nejkrásnější dar přírody.“ Albert Einstein
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Samik11
David Čápka:

Proč je prosím každá komponenta vložená ještě v panelu, je to nutné?

Odpovědět 23.1.2013 19:31
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
Fugiczek
Redaktor
Avatar
Odpovídá na David Čápka
Fugiczek:

Nutné to není a zde je to úplně zbytečné, nejspíše to tu dal jen kvůli obarvení ale to mohl udělat i u komponent.

 
Odpovědět 23.1.2013 20:52
Avatar
newim
Neregistrovaný
Avatar
newim:

Ahoj, nenatočíte někdo video?
Pořád mi to hlásí chyby.

 
Odpovědět 25.6.2013 15:11
Avatar
Samik11
Redaktor
Avatar
Odpovídá na newim
Samik11:

Na konci článku máš zdrojový kód. Stáhni a porovnej... ;)

Odpovědět 25.6.2013 23:38
„Radost vidět a rozumět, to je nejkrásnější dar přírody.“ Albert Einstein
Avatar
Tomhaus
Člen
Avatar
Tomhaus:

Jak můžu nastavit pozici nějakému TextFieldu?

Odpovědět 24.6.2014 20:25
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Hans Deutscher:

Nemělo by místo

panel1 = new JPanel();

být radši

JPanel panel1 = new JPanel();

???
Tak, jak to máš napsané, mi to totiž hlásí chybu. :-)
Jinak ale děkuji za návod. :-)

 
Odpovědět 28. února 17:10
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 9 zpráv z 9.