Principy tvorby GUI

Proč to potřebuji?

Grafické uživatelské rozhraní (GUI) je nezbytné pro tvorbu desktopových aplikací. Pochopení událostmi řízeného programování a návrhového vzoru MVC je klíčové pro správný návrh interaktivních aplikací.

Teorie

Událostmi řízené programování (event-driven): program reaguje na události (kliknutí, stisk klávesy). Registrují se listenery, které se volají při události.

MVC (Model-View-Controller): Model = data a logika, View = zobrazení, Controller = zpracování vstupů. Oddělení zodpovědností.

Layouty řídí rozmístění komponent: FlowLayout, BorderLayout, GridLayout, BoxLayout.

Příklady

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

// === Model ===
class PocitadloModel {
    private int hodnota = 0;

    public int getHodnota() { return hodnota; }
    public void zvys() { hodnota++; }
    public void sniz() { hodnota--; }
}

// === View + Controller (zjednodušené) ===
public class PocitadloGUI extends JFrame {
    private PocitadloModel model = new PocitadloModel();
    private JLabel label;

    public PocitadloGUI() {
        setTitle("Počítadlo");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(300, 150);

        // Komponenty
        label = new JLabel("0", SwingConstants.CENTER);
        label.setFont(new Font("Arial", Font.BOLD, 24));

        JButton plusBtn = new JButton("+");
        JButton minusBtn = new JButton("-");

        // Layout
        setLayout(new BorderLayout());
        add(label, BorderLayout.CENTER);

        JPanel panel = new JPanel(new FlowLayout());
        panel.add(minusBtn);
        panel.add(plusBtn);
        add(panel, BorderLayout.SOUTH);

        // Event listenery (Controller)
        plusBtn.addActionListener(e -> {
            model.zvys();
            aktualizujView();
        });

        minusBtn.addActionListener(e -> {
            model.sniz();
            aktualizujView();
        });
    }

    private void aktualizujView() {
        label.setText(String.valueOf(model.getHodnota()));
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new PocitadloGUI().setVisible(true);
        });
    }
}

// Komponenty s modelem – příklad JTable
String[] sloupce = {"Jméno", "Věk"};
Object[][] data = {{"Jan", 25}, {"Eva", 22}};
JTable tabulka = new JTable(data, sloupce);
// JTable používá TableModel pro oddělení dat od zobrazení

Shrnutí

Klíčové body

  • Event-driven: listener reaguje na událost (ActionListener, MouseListener)
  • MVC: Model (data) – View (zobrazení) – Controller (logika)
  • Layout managery: BorderLayout, FlowLayout, GridLayout
  • Swing: JFrame, JPanel, JButton, JLabel, JTable