From 49e32b316ec4fa7528db55cb620a4407232cdcb6 Mon Sep 17 00:00:00 2001 From: dick Date: Wed, 8 Oct 2025 14:53:45 +0200 Subject: [PATCH] Fenetre fix + Event.java --- src/Dessin.java | 2 +- src/Event.java | 70 ++++++++++++++++++++++++++++++ src/Fenetre.java | 111 ++++++++++++++--------------------------------- 3 files changed, 103 insertions(+), 80 deletions(-) create mode 100644 src/Event.java diff --git a/src/Dessin.java b/src/Dessin.java index 92435cc..8c58016 100644 --- a/src/Dessin.java +++ b/src/Dessin.java @@ -4,7 +4,7 @@ import java.awt.*; /** * La classe Dessin gère uniquement le dessin du pendu * -* @version 0.1 +* @version 1.0 * @author Adrien * Date : 08-10-2025 * Licence : diff --git a/src/Event.java b/src/Event.java new file mode 100644 index 0000000..ec85c6f --- /dev/null +++ b/src/Event.java @@ -0,0 +1,70 @@ +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); + } + } +} + diff --git a/src/Fenetre.java b/src/Fenetre.java index 44a7586..a62c14e 100644 --- a/src/Fenetre.java +++ b/src/Fenetre.java @@ -1,40 +1,38 @@ import javax.swing.*; import java.awt.*; -import java.awt.event.*; import java.util.function.Consumer; /** - * La classe Fenetre gère uniquement l'interface graphique : - * - zone de dessin (assurée par la classe Dessin) - * - affichage du mot masqué - * - saisie d'une lettre (événement remonté via un handler) - * - * Aucune logique de jeu (choix/vérification du mot) n'est ici. - * - * @version 1.0 - * @author Adrien - * Date : 08-10-25 - * Licence : - */ +* La classe Fenetre gère uniquement l'interface graphique : +* - zone de dessin (assurée par la classe Dessin) +* - affichage du mot masqué +* - saisie d'une lettre (les événements sont gérés dans Event) +* +* Aucune logique de jeu ici. +* @version 1.5 +* @author Adrien +* Date : 08-10-2025 +* Licence : +*/ + public class Fenetre { - // --- Composants de l'interface (UI only) --- + // --- Composants de l'interface --- private JFrame window; private JLabel wordLabel; private JTextField letterInput; private JButton sendButton; private JPanel drawZone; // instance de Dessin - // Handler externe pour la lettre soumise (fourni par la classe Partie / contrôleur) - private Consumer onLetterSubmitted; - - // --- Constructeur (orchestration courte) --- + // --- Constructeur --- public Fenetre() { setupWindow(); - JPanel root = createRoot(); + + JPanel root = new JPanel(); + root.setLayout(new BoxLayout(root, BoxLayout.Y_AXIS)); window.setContentPane(root); - drawZone = createDrawZone(); // -> new Dessin() + drawZone = new Dessin(); root.add(drawZone); wordLabel = createWordLabel(); @@ -48,7 +46,6 @@ public class Fenetre { } // --- Initialisation fenêtre --- - /** Configure la fenêtre principale (titre, taille, fermeture). */ private void setupWindow() { window = new JFrame("Jeu du Pendu"); window.setSize(600, 600); @@ -56,20 +53,7 @@ public class Fenetre { window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } - /** Crée le conteneur principal vertical. */ - private JPanel createRoot() { - JPanel root = new JPanel(); - root.setLayout(new BoxLayout(root, BoxLayout.Y_AXIS)); - return root; - } - // --- Sous-composants UI --- - /** Crée la zone de dessin via la classe Dessin. */ - private JPanel createDrawZone() { - return new Dessin(); - } - - /** Crée le label d'affichage du mot (placeholder jusqu'à injection par Partie). */ private JLabel createWordLabel() { JLabel label = new JLabel("_ _ _ _ _", SwingConstants.CENTER); label.setFont(new Font("Segoe UI", Font.BOLD, 32)); @@ -78,7 +62,6 @@ public class Fenetre { return label; } - /** Crée la zone de saisie (champ + bouton) et branche l'action. */ private JPanel createInputPanel() { JPanel inputPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10)); JLabel prompt = new JLabel("Entrez une lettre :"); @@ -89,57 +72,27 @@ public class Fenetre { sendButton = new JButton("Envoyer"); - Action sendAction = new AbstractAction() { - @Override public void actionPerformed(ActionEvent e) { submitLetter(); } - }; - sendButton.addActionListener(sendAction); - letterInput.addActionListener(sendAction); - - 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)); - } - }); - inputPanel.add(prompt); inputPanel.add(letterInput); inputPanel.add(sendButton); return inputPanel; } - // --- Partie <-> UI --- - - /** Définit le texte du mot affiché (ex: "_ _ A _ _") fourni par la classe Partie. */ - public void setWordDisplay(String maskedWord) { - wordLabel.setText(maskedWord != null ? maskedWord : ""); - } - - /** Définit le handler appelé quand l'utilisateur soumet une lettre. */ - public void setOnLetterSubmitted(Consumer handler) { - this.onLetterSubmitted = handler; - } - - // --- Méthodes privées UI --- - /** Récupère la lettre et notifie le handler externe (aucune logique de jeu ici). */ - private void submitLetter() { - String text = letterInput.getText().trim().toUpperCase(); - letterInput.setText(""); - if (text.length() != 1 || !text.matches("[A-Z]")) { - JOptionPane.showMessageDialog(window, "Veuillez entrer une seule lettre (A-Z)."); - return; - } - if (onLetterSubmitted != null) onLetterSubmitted.accept(text.charAt(0)); - else JOptionPane.showMessageDialog(window, "Lettre soumise (placeholder) : " + text); - } + // --- Getters pour Event --- + public JFrame getWindow() { return window; } + public JTextField getLetterInput() { return letterInput; } + public JButton getSendButton() { return sendButton; } + public JLabel getWordLabel() { return wordLabel; } + public JPanel getDrawZone() { return drawZone; } // --- Méthode principale de test --- public static void main(String[] args) { - Fenetre f = new Fenetre(); - f.setWordDisplay("_ _ _ _ _"); // placeholder - f.setOnLetterSubmitted(ch -> - JOptionPane.showMessageDialog(null, "Lettre reçue : " + ch + " (sans logique de jeu)") - ); + SwingUtilities.invokeLater(() -> { + Fenetre f = new Fenetre(); + // On passe le handler directement ici (pas de setOnLetterSubmitted) + new Event(f, ch -> + JOptionPane.showMessageDialog(f.getWindow(), "Lettre reçue : " + ch + " (sans logique de jeu)") + ); + }); } -} +} \ No newline at end of file