Swing : boutons, clics souris et événements
Objectif
Construire une petite interface Swing avec boutons, champs texte, table et gestion d’événements (ActionListener, MouseAdapter). Option : brancher au DAO JDBC.
Code exemple (indépendant, stockage en mémoire)
// src/ui/StudentTableModel.java
package ui;
import model.Student;
import javax.swing.table.AbstractTableModel;
import java.util.List;
public class StudentTableModel extends AbstractTableModel {
private final String[] cols = {"ID","Nom","Année"};
private final List<Student> data;
public StudentTableModel(List<Student> data){ this.data = data; }
@Override public int getRowCount(){ return data.size(); }
@Override public int getColumnCount(){ return cols.length; }
@Override public String getColumnName(int c){ return cols[c]; }
@Override public Object getValueAt(int r, int c){
var s = data.get(r);
return switch(c){
case 0 -> s.id();
case 1 -> s.name();
case 2 -> s.year();
default -> "";
};
}
}
// src/ui/MainSwing.java
package ui;
import model.Student;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Comparator;
public class MainSwing {
private final java.util.List<Student> students = new ArrayList<>();
private void initUI() {
JFrame f = new JFrame("Gestion étudiants (Swing)");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(640, 420);
f.setLocationRelativeTo(null);
// Haut: formulaire
var tfId = new JTextField(8);
var tfName = new JTextField(12);
var tfYear = new JTextField(4);
var btnAdd = new JButton("Ajouter");
var btnSort = new JButton("Trier (Nom)");
var top = new JPanel(new FlowLayout(FlowLayout.LEFT));
top.add(new JLabel("ID:")); top.add(tfId);
top.add(new JLabel("Nom:")); top.add(tfName);
top.add(new JLabel("Année:")); top.add(tfYear);
top.add(btnAdd); top.add(btnSort);
// Centre: table
var model = new StudentTableModel(students);
var table = new JTable(model);
var scroll = new JScrollPane(table);
// Bas: statut
var status = new JLabel("Prêt.");
// Actions
btnAdd.addActionListener(e -> {
try {
var id = tfId.getText().trim();
var name = tfName.getText().trim();
var year = Integer.parseInt(tfYear.getText().trim());
if (id.isEmpty() || name.isEmpty()) throw new IllegalArgumentException("Champs requis");
students.add(new Student(id, name, year));
((AbstractTableModel) table.getModel()).fireTableDataChanged();
status.setText("Ajouté: " + name);
tfId.setText(""); tfName.setText(""); tfYear.setText("");
} catch (Exception ex) {
JOptionPane.showMessageDialog(f, ex.getMessage(), "Erreur", JOptionPane.ERROR_MESSAGE);
}
});
btnSort.addActionListener(e -> {
students.sort(Comparator.comparing(Student::name));
((AbstractTableModel) table.getModel()).fireTableDataChanged();
status.setText("Tri par nom effectué.");
});
table.addMouseListener(new MouseAdapter() {
@Override public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
int row = table.getSelectedRow();
if (row >= 0) {
var s = students.get(row);
JOptionPane.showMessageDialog(f, s.toString(), "Détails", JOptionPane.INFORMATION_MESSAGE);
}
}
}
});
f.setLayout(new BorderLayout());
f.add(top, BorderLayout.NORTH);
f.add(scroll, BorderLayout.CENTER);
f.add(status, BorderLayout.SOUTH);
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new MainSwing().initUI());
}
}
TP (à rendre)
- Étendre l’UI pour supprimer la ligne sélectionnée (bouton “Supprimer”).
- Ajouter un bouton “Charger depuis DB” qui remplit la table avec
StudentDao.findAll()
(si JDBC configuré). - Ajouter une validation (année ∈ {1,2}) et un message d’erreur user-friendly.
Corrigé (pistes)
// Suppression
var btnDel = new JButton("Supprimer");
btnDel.addActionListener(e -> {
int row = table.getSelectedRow();
if (row >= 0) {
students.remove(row);
((AbstractTableModel) table.getModel()).fireTableDataChanged();
}
});
Vigilances
- Exécuter l’UI sur le thread événementiel :
SwingUtilities.invokeLater
. - Ne pas bloquer l’EDT avec des accès JDBC (utiliser un
SwingWorker
si nécessaire).
Ce contenu est réservé aux membres du site. Si vous êtes un utilisateur existant, veuillez vous connecter. Les nouveaux utilisateurs peuvent s'inscrire ci-dessous.