forked from menault/TD3_DEV51_Qualite_Algo
		
	Fenetre fix + Event.java
This commit is contained in:
		| @@ -4,7 +4,7 @@ import java.awt.*; | ||||
| /** | ||||
| * La classe <code>Dessin</code> gère uniquement le dessin du pendu | ||||
| * | ||||
| * @version 0.1 | ||||
| * @version 1.0 | ||||
| * @author Adrien | ||||
| * Date : 08-10-2025 | ||||
| * Licence : | ||||
|   | ||||
							
								
								
									
										70
									
								
								src/Event.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								src/Event.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| import javax.swing.*; | ||||
| import java.awt.event.*; | ||||
| import java.util.function.Consumer; | ||||
|  | ||||
| /** | ||||
| * La classe <code>Event</code> 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<Character> onLetterSubmitted; | ||||
|  | ||||
|     public Event(Fenetre fenetre, Consumer<Character> 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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
							
								
								
									
										111
									
								
								src/Fenetre.java
									
									
									
									
									
								
							
							
						
						
									
										111
									
								
								src/Fenetre.java
									
									
									
									
									
								
							| @@ -1,40 +1,38 @@ | ||||
| import javax.swing.*; | ||||
| import java.awt.*; | ||||
| import java.awt.event.*; | ||||
| import java.util.function.Consumer; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>Fenetre</code> 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 <code>Fenetre</code> 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<Character> 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<Character> 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)") | ||||
|             ); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user