Spis treści

Demo 1 (łatwe): Formularz powitania

Cel: szybkie przejście przez JFrame, JTextField, JButton, JLabel, listener.

Zadanie demonstracyjne:

Wskazówki:

Rozwiązanie:

public class DemoGreeting {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(DemoGreeting::showUi);
    }
 
    static void showUi() {
        JFrame f = new JFrame("Powitanie");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        JTextField tfFirst = new JTextField();
        JTextField tfLast = new JTextField();
        JButton btn = new JButton("Przywitaj");
        JLabel out = new JLabel(" ");
 
        JPanel p = new JPanel(new GridLayout(0, 2, 8, 8));
        p.add(new JLabel("Imię:"));
        p.add(tfFirst);
        p.add(new JLabel("Nazwisko:"));
        p.add(tfLast);
        p.add(btn);
        p.add(out);
 
        btn.addActionListener(e -> {
            String full = tfFirst.getText().trim() + " " + tfLast.getText().trim();
            out.setText("Witaj, " + full.trim());
        });
 
        f.setContentPane(p);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

Demo 2 (średnie): Lista z modelem danych

Cel: DefaultListModel, JList, operacje dodaj/usuń.

Zadanie demonstracyjne:

Wskazówki:

Rozwiązanie:

public class DemoListModel {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame f = new JFrame("Lista z modelem");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
            DefaultListModel<String> model = new DefaultListModel<>();
            JList<String> list = new JList<>(model);
            JTextField tf = new JTextField(16);
            JButton add = new JButton("Dodaj");
            JButton remove = new JButton("Usuń zaznaczony");
 
            add.addActionListener(e -> {
                String text = tf.getText().trim();
                if (!text.isEmpty()) {
                    model.addElement(text);
                    tf.setText("");
                }
            });
 
            remove.addActionListener(e -> {
                int idx = list.getSelectedIndex();
                if (idx >= 0) {
                    model.remove(idx);
                } else {
                    JOptionPane.showMessageDialog(f, "Najpierw zaznacz element");
                }
            });
 
            JPanel top = new JPanel();
            top.add(tf);
            top.add(add);
            top.add(remove);
 
            f.add(top, BorderLayout.NORTH);
            f.add(new JScrollPane(list), BorderLayout.CENTER);
            f.setSize(520, 320);
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        });
    }
}

Demo 3 (trudniejsze): Tabela i Action

Cel: DefaultTableModel, wspólna akcja dla przycisku i menu.

Zadanie demonstracyjne:

Wskazówki:

Rozwiązanie:

public class DemoTableAction {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame f = new JFrame("Tabela + Action");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
            DefaultTableModel model = new DefaultTableModel(new Object[]{"ID", "Nazwa", "Cena"}, 0);
            JTable table = new JTable(model);
 
            Action addSample = new AbstractAction("Dodaj próbkę") {
                int id = 1;
                @Override
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    model.addRow(new Object[]{id++, "Produkt", 19.99});
                }
            };
 
            JToolBar bar = new JToolBar();
            bar.add(new JButton(addSample));
 
            JMenu file = new JMenu("Dane");
            file.add(new JMenuItem(addSample));
            JMenuBar mb = new JMenuBar();
            mb.add(file);
            f.setJMenuBar(mb);
 
            f.add(bar, BorderLayout.NORTH);
            f.add(new JScrollPane(table), BorderLayout.CENTER);
            f.setSize(640, 360);
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        });
    }
}

Zadania do samodzielnego wykonania - wybór

Zadanie A: Kalkulator BMI

Wymagania:

Wskazówki:

Rozwiązanie:

static String bmiCategory(double bmi) {
    if (bmi < 18.5) return "Niedowaga";
    if (bmi < 25.0) return "Norma";
    if (bmi < 30.0) return "Nadwaga";
    return "Otyłość";
}
 
// fragment listenera
try {
    double cm = Double.parseDouble(tfHeight.getText().trim());
    double kg = Double.parseDouble(tfWeight.getText().trim());
    double m = cm / 100.0;
    double bmi = kg / (m * m);
    out.setText(String.format("BMI: %.2f (%s)", bmi, bmiCategory(bmi)));
} catch (NumberFormatException ex) {
    JOptionPane.showMessageDialog(frame, "Podaj poprawne liczby");
}

Zadanie B: Notatnik TODO (JList)

Wymagania:

Wskazówki:

Rozwiązanie:

int i = list.getSelectedIndex();
if (i >= 0) {
    String old = model.get(i);
    if (!old.startsWith("[x] ")) {
        model.set(i, "[x] " + old);
    }
}

Zadanie C: Formularz rejestracji

Wymagania:

Wskazówki:

Rozwiązanie:

void validateForm() {
    String email = tfEmail.getText().trim();
    String pass1 = new String(pf1.getPassword());
    String pass2 = new String(pf2.getPassword());
 
    boolean okEmail = email.contains("@") && email.contains(".");
    boolean okPass = pass1.length() >= 8 && pass1.equals(pass2);
    boolean okTerms = cbTerms.isSelected();
 
    btnRegister.setEnabled(okEmail && okPass && okTerms);
}

Zadanie D: Mini CRM (JTable)

Wymagania:

Wskazówki:

Rozwiązanie:

DefaultTableModel model = new DefaultTableModel(new Object[]{"ID", "Imię", "Miasto", "Status"}, 0);
JTable table = new JTable(model);
TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<>(model);
table.setRowSorter(sorter);
 
// fragment filtrowania
String city = tfCityFilter.getText().trim();
if (city.isEmpty()) {
    sorter.setRowFilter(null);
} else {
    sorter.setRowFilter(RowFilter.regexFilter("(?i)" + java.util.regex.Pattern.quote(city), 2));
}

Zadanie 6 Kalkulator

Utwórz prosty, czterodziałaniowy kalkulator wykorzystujący Swing dla języka Java. Przy przygotowaniu GUI inspiruj się kalkulatorem systemu Windows. Zadbaj o obsługę liczb niecałkowitych.

Wskazówki: