Cel: szybkie przejście przez JFrame, JTextField, JButton, JLabel, listener.
Zadanie demonstracyjne:
Wskazówki:
JPanel + GridLayout(0, 2, 8, 8)addActionListenergetText().trim()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); } }
Cel: DefaultListModel, JList, operacje dodaj/usuń.
Zadanie demonstracyjne:
Wskazówki:
DefaultListModel<String>list.getSelectedIndex() zwraca pozycję zaznaczeniaJOptionPaneRozwią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); }); } }
Cel: DefaultTableModel, wspólna akcja dla przycisku i menu.
Zadanie demonstracyjne:
Wskazówki:
Action dziedzicząc po AbstractActionactionPerformed modyfikuj DefaultTableModelAction podłącz do JButton i JMenuItemRozwią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); }); } }
JListJTable + DefaultTableModelWymagania:
Wskazówki:
Double.parseDoubleNumberFormatException i pokaż komunikat JOptionPaneRozwią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"); }
Wymagania:
Wskazówki:
DefaultListModel<String>set(index, value)ActionRozwiązanie:
int i = list.getSelectedIndex(); if (i >= 0) { String old = model.get(i); if (!old.startsWith("[x] ")) { model.set(i, "[x] " + old); } }
Wymagania:
Wskazówki:
JPasswordFieldDocumentListener)validateForm() i w niej steruj setEnabledRozwią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); }
Wymagania:
Wskazówki:
DefaultTableModelTableRowSorterRozwią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)); }
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:
JTextField do wyświetlania aktualnego wyniku i wprowadzania liczbActionListener