→ Slide 1

Zajęcia 8. - Graficzne interfejsy użytkownika - Swing

→ Slide 2

Swing - wprowadzenie

→ Slide 3

Swing i AWT - podobieństwa

→ Slide 4

Swing i AWT - różnice

→ Slide 5

Hierarchia Swing - najważniejsze klasy

114_1.jpg

→ Slide 6

Top-level containers

JFrame frame = new JFrame("Warstwy Swing");
JComponent glass = (JComponent) frame.getGlassPane();
glass.setVisible(false); // np. true gdy chcemy overlay
 
Container content = frame.getContentPane();
content.setLayout(new BorderLayout());
content.add(new JLabel("Treść główna"), BorderLayout.CENTER);
→ Slide 7

Pierwsze okno Swing

import javax.swing.*;
import java.awt.*;
 
public class HelloSwing extends JFrame {
    public HelloSwing() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(new JLabel("Witaj, Swing!", SwingConstants.CENTER), BorderLayout.CENTER);
        pack();
        setLocationRelativeTo(null);
    }
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            HelloSwing frame = new HelloSwing();
            frame.setVisible(true);
        });
    }
}
→ Slide 8

Kontrolki Swing - szybki przegląd

→ Slide 9

Obsługa zdarzeń

JButton btn = new JButton("Policz");
JTextField input = new JTextField(10);
JLabel out = new JLabel("Wynik: -");
 
btn.addActionListener(e -> {
    String text = input.getText().trim();
    out.setText("Wynik: " + text.length());
});
→ Slide 10

Layout Managers

→ Slide 11

Swing GUI Designer

→ Slide 12

Look & Feel - dostosowanie wyglądu

for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
    if ("Nimbus".equals(info.getName())) {
        UIManager.setLookAndFeel(info.getClassName());
        break;
    }
}
→ Slide 13

MVC w Swing

→ Slide 14

Modele danych w Swing

Dane trzymasz w modelu, a komponent tylko je wyświetla.

Komponent Interfejs modelu Domyślna implementacja Opis
JList ListModel DefaultListModel Lista elementów
JTable TableModel DefaultTableModel Tabela wierszy i kolumn
JComboBox ComboBoxModel DefaultComboBoxModel Lista rozwijana
JTree TreeModel DefaultTreeModel Drzewo węzłów
JTextField, JTextArea Document PlainDocument Treść pola tekstowego
JProgressBar, JSlider, JScrollBar BoundedRangeModel DefaultBoundedRangeModel Wartość w zakresie min–max
JSpinner SpinnerModel SpinnerNumberModel Wartość incrementalna
JButton, JCheckBox, JRadioButton ButtonModel DefaultButtonModel Stan przycisku (wciśnięty, zaznaczony)
↓ Slide 15

Przykład

DefaultListModel<String> listModel = new DefaultListModel<>();
listModel.addElement("Ala");
listModel.addElement("Ola");
JList<String> list = new JList<>(listModel);
 
DefaultTableModel tableModel = new DefaultTableModel(
    new Object[]{"ID", "Nazwa"}, 0
);
tableModel.addRow(new Object[]{1, "Klient"});
JTable table = new JTable(tableModel);
→ Slide 16

Akcje Swing (Action API)

Action saveAction = new AbstractAction("Zapisz") {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Zapis...");
    }
};
saveAction.putValue(Action.SHORT_DESCRIPTION, "Zapisz dane");
 
JButton saveBtn = new JButton(saveAction);
JMenuItem saveItem = new JMenuItem(saveAction);
→ Slide 17

MVC w Swing

Przykład MVC w Swing

Java Swing MVC Example

* Model — czysta logika i dane (np. stan aplikacji, obliczenia, walidacja) * View — komponenty Swing (JFrame, JPanel, JButton, JTable) * Controller — listenery, które reagują na zdarzenia i wywołują metody modelu

→ Slide 18

MVVM-like w Swing + PropertyChangeListener

class PersonViewModel {
    private final java.beans.PropertyChangeSupport pcs = new java.beans.PropertyChangeSupport(this);
    private String name = "";
 
    public void setName(String newName) {
        String old = this.name;
        this.name = newName;
        pcs.firePropertyChange("name", old, newName);
    }
 
    public void addPropertyChangeListener(java.beans.PropertyChangeListener l) {
        pcs.addPropertyChangeListener(l);
    }
}
→ Slide 19

Zadanie 7: Kalkulator w Swing

Utwórz prosty kalkulator wykorzystujący Swing dla języka Java.

Wymagania:

Przykładowy wygląd aplikacji:

Kalkulator w Swing - przykładowy interfejs

→ Slide 20

Materiały dodatkowe