import javax.swing.*; import java.awt.event.*; import java.util.function.Consumer; /** * La classe Event regroupe et branche tous les listeners liés à Fenetre. * - Validation de la saisie (1 lettre A-Z, majuscule) * - Action sur Entrée ou clic bouton * - Notification du handler externe (Fenetre#setOnLetterSubmitted) * Aucune logique de jeu ici. * @version 1.1 * @author Adrien * Date : 08-10-2025 * Licence : */ public class Event { private final Fenetre fenetre; private final Consumer onLetterSubmitted; public Event(Fenetre fenetre, Consumer onLetterSubmitted) { this.fenetre = fenetre; this.onLetterSubmitted = onLetterSubmitted; wireEvents(); } /** Branchement des listeners sur les composants de Fenetre. */ private void wireEvents() { JTextField letterInput = fenetre.getLetterInput(); JButton sendButton = fenetre.getSendButton(); // Action (Entrée + clic bouton) Action sendAction = new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { submitLetter(); } }; sendButton.addActionListener(sendAction); letterInput.addActionListener(sendAction); // UX : limiter à une seule lettre et forcer la majuscule letterInput.addKeyListener(new KeyAdapter() { @Override public void keyTyped(KeyEvent e) { char c = e.getKeyChar(); if (!Character.isLetter(c) || letterInput.getText().length() >= 1) { e.consume(); } else { e.setKeyChar(Character.toUpperCase(c)); } } }); } /** Récupère, valide et transmet la lettre au handler externe. */ private void submitLetter() { JTextField letterInput = fenetre.getLetterInput(); String text = letterInput.getText().trim().toUpperCase(); letterInput.setText(""); if (text.length() != 1 || !text.matches("[A-Z]")) { JOptionPane.showMessageDialog(fenetre.getWindow(), "Veuillez entrer une seule lettre (A-Z)."); return; } if (onLetterSubmitted != null) { onLetterSubmitted.accept(text.charAt(0)); } else { JOptionPane.showMessageDialog(fenetre.getWindow(), "Lettre soumise (placeholder) : " + text); } } }