PV168/Swing 1: Porovnání verzí

Z FI WIKI
Přejít na: navigace, hledání
(Kontrola úlohy č. 5: odstraněno)
(Zadání domácí úlohy: odstraněno)
Řádka 87: Řádka 87:
 
=== Prohlížení a úprava generovaného kódu ===
 
=== Prohlížení a úprava generovaného kódu ===
 
Až do okna naskládate nějaké komponenty, přepněte se na zobrazení zdrojových kódů. Všimněte si, že části kódu jsou podbarveny šedě a nelze je editovat. Jedná se o kód, který generují NetBeans. Tento kód se nedá změnit přímo, ale je možné jej modifikovat pomocí vlastností jednotlivých komponent (cvičící ukáže).
 
Až do okna naskládate nějaké komponenty, přepněte se na zobrazení zdrojových kódů. Všimněte si, že části kódu jsou podbarveny šedě a nelze je editovat. Jedná se o kód, který generují NetBeans. Tento kód se nedá změnit přímo, ale je možné jej modifikovat pomocí vlastností jednotlivých komponent (cvičící ukáže).
 
== Zadání domácí úlohy ==
 
Zkuste si navrhnout, jak by mělo vypadat rozhraní Vaší aplikace. Příští hodinu Vám cvičící zkontroluje, jestli jde o uživatelsky přívětivé řešení. Úloha sice není bodovaná, ale nevynechejte ji — pokud nebudete mít zpětnou vazbu, jestli je navrhované rozhraní uživatelsky přívětivé, riskujete, že Vám za to později budou strženy body.
 
  
 
[[Kategorie:PV168]]
 
[[Kategorie:PV168]]

Verze z 18. 2. 2011, 19:48

Anonymní třídy

Pro jistotu vysvětlit princip anonymních tříd. Vysvětlit také, že lokální proměnné musí být final, aby byly přístupné z anonynmní třídy.

První aplikace využívající SWING

V NetBeans si vytvořte nový projekt typu Java Application a nazvěteho ho např. Swing1. Do třídy Main vložte následující kód:

public class Main {
 
    public static void main(String[] args) {
 
        // Inicializaci GUI provedeme ve vlákně message dispatcheru,
        // ne v hlavním vlákně (bude vysvětleno později)!
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                // Vytvoříme instanci třídy Frame, která reprezentuje okno
                JFrame frame = new JFrame();
                // Zajistíme, aby se po zavření okna ukončila i aplikace
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                // Nastavíme titulek okna
                frame.setTitle("Moje první okno");
                // Zobrazíme okno
                frame.setVisible(true);
            }
        });
    }
}

Všimněte si několika věcí:

  • Kód pro vytvoření a zobrazení okna je zapouzdřen do anonymní třídy implementující rozhraní Runnable. Instance této třídy je potom předána jako parametr metodě SwingUtilities.invokeLater(java.lang.Runnable). Tím je zajištěno, že inicializace GUI proběhne ve správném vlákně (o vláknech ve swingu bude řeč později).
  • Okno je reprezentováno třídou JFrame.
  • Oknu můžeme nastavit různé vlastnosti voláním příslušných set metod. Podobným způsobem můžeme nastavnastavit různé vlastnosti u každé swingové komponenty. (Swingové komponenty jsou tzv. JavaBeans komponenty).
  • Okno se zobrazí nastavením vlastnosti visible na true.
  • Aby se aplikace po uzavření okna automaticky ukončila, je nutné vlastnost defaultCloseOperation nastavit na hodnotu JFrame.EXIT_ON_CLOSE).

Pro automatické doplnění importů klikněte v editoru pravým tlačítkem myši a z kontextového menu vyberte operaci Fix imports. Potom zkuste aplikaci spustit. Na obrazovce by se mělo zobrazit okno, které bude zmenšené na nejmenší možnou velikost, takže ho budete asi muset chvíli hledat. Okno zvětšete a potom zavřete.

Do okna nyní přidáme tlačítko. Před operaci frame.setVisible(true) vložte následující kód:

JButton helloButton = new JButton();
helloButton.setText("Řekni ahoj");
frame.add(helloButton);
frame.pack();

Opět nechte doplnit importy a aplikaci spusťte. Nyní bude v okně tlačítko, které ale zatím nic nedělá. Aby začalo něco dělat, musíme se podívat na způsob, jakým se ve swingu pracuje s událostmi.

Tip: Zkuste si okno maximalizovat. To je velké tlačítko, že? Tohle souvisí s tzv. Layouty, o nichž bude řeč později.

Zpracování událostí

Jedním ze základních konceptů swingu je událostmi řízené programování (viz Swing#Zpracování událostí). To znamená, že jakékoliv akce nebo změny v aplikaci jsou řízeny tzv. událostmi. Zdrojem události může být uživatel (např. prostřednictvím klávesnice, myši nebo jiné vstupní periferie) nebo některá z komponent v aplikaci. Tyto události jsou doručeny příslušným komponentám, které na ně mohou zareagovat.

Pokud chceme reagovat na nějakou událost (což je v podstatě jediný způsob, jak programovat chování aplikace), musíme nejdříve vytvořit tzv. posluchače (EventListner), který bude na danou událost reagovat. Tento posluchač se pak musí zaregistrovat jako příjemce události u příslušné komponenty.

// Vytvoříme instanci tlačítka
JButton button = new JButton("Moje");
 
// Vytvoříme posluchače události
ActionListener actionListener = new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // Zobrazíme dialogový box s informací o stisknutí tlačítka
        JOptionPane.showMessageDialog(null,"Stisknuto tlačítko: " +
            e.getActionCommand());
        }
    };
 
// Zaregistrujeme posluchače u komponenty, která událost může generovat
button.addActionListener(actionListener);

Posluchač události musí implementovat příslušné rozhraní (v tomto případě ActionListener) a implementovat příslušné metody. Některé posluchače mohou reagovat na více typů událostí a tudíž mít více metod (např. MouseListener má metody mouseClicked, mouseEntered, mouseExited, mousePressed a mouseReleased).

Přidání práce s událostmi do naší aplikace

Rozšiřte vaši aplikaci tak, aby se po stisku tlačítka helloButton zobrazilo dialogové okno, které zobrazí řetězec "Ahoj".

Nyní naši aplikaci rozšíříme ještě o komponentu JTextField a jedno tlačítko. Před řádek frame.pack(); vložte následující kód:

// Layoutům se budeme věnovat později
frame.setLayout(new FlowLayout());
final JTextField textField = new JTextField("Some text");
final JButton clickOnMeButton = new JButton("Click on me");

Potom rozšiřte aplikaci tak, aby ve Vašem okně byly kromě tlačítka helloButton také textový box textField a tlačítko clickOnMeButton. Po stisku tlačítka clickOnMeButton se text z boxu textField zkopíruje jako text do tlačítka clickOnMeButton.

Komponenty v knihovně swing

Knihovna SWING obsahuje řadu různých komponent. Zatím známe JFrame, JButton a JTextField. Abychom se seznámili s ostatními komponentami, využijeme vizuální návrhář NetBeans. Otevřete průvodce pro vytvoření nového souboru (menu File/New File... nebo Ctrl+N) a z kategorie Swing GUI Forms vyberte JFrame Form. Vyberte vhodné jméno a balíček a klikněte na tlačítko Finish. V levé části okna by se mělo otevřít vaše nové okno a v pravé části by se měla objevit paleta s komponentami. Zkuste si s návrhářem pohrát a přidat do Vašeho okna nějaké komponenty.

Prohlížení a úprava generovaného kódu

Až do okna naskládate nějaké komponenty, přepněte se na zobrazení zdrojových kódů. Všimněte si, že části kódu jsou podbarveny šedě a nelze je editovat. Jedná se o kód, který generují NetBeans. Tento kód se nedá změnit přímo, ale je možné jej modifikovat pomocí vlastností jednotlivých komponent (cvičící ukáže).