Spis treści

REVEAL theme=simple&disableLayout=0&transition=none&controls=1&show_progress_bar=1&build_all_lists=0&show_image_borders=0&horizontal_slide_level=2&enlarge_vertical_slide_headers=0&show_slide_details=1&open_in_new_window=1&size=1024×768

<html> <style type=„text/css”> p { text-align: left; } .reveal { font-size: 30px; } .reveal section { width: 96%; margin: 0 auto; } .reveal .slides { width: 60% !important; } .reveal ul, .reveal ol { margin-left: 1.5em; } .reveal pre code {

height: 100%;
max-height: 100%;
box-sizing: border-box;

} </style> </html>

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

Swing - wprowadzenie

Swing i AWT - podobieństwa

Swing i AWT - różnice

Hierarchia Swing

114_1.jpg

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);

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);
        });
    }
}

Kontrolki Swing - szybki przegląd

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());
});

Layout Managers

Swing GUI Designer

Wtyczka do IntelliJ IDEA do projektowania interfejsów metodą drag-and-drop

 
Przykład GUI Designer - edycja formy

Swing GUI Designer

Look & Feel - dostosowanie wyglądu

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

MVC w Swing

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)

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);

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);

MVC w Swing

Przykład MVC w Swing

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);
    }
}

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

Materiały dodatkowe