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