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
|
* La classe <code>Dessin</code> gère uniquement le dessin du pendu
|
||||||
*
|
*
|
||||||
* @version 0.1
|
* @version 1.0
|
||||||
* @author Adrien
|
* @author Adrien
|
||||||
* Date : 08-10-2025
|
* Date : 08-10-2025
|
||||||
* Licence :
|
* 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
105
src/Fenetre.java
105
src/Fenetre.java
@@ -1,40 +1,38 @@
|
|||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.event.*;
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* La classe <code>Fenetre</code> gère uniquement l'interface graphique :
|
* La classe <code>Fenetre</code> gère uniquement l'interface graphique :
|
||||||
* - zone de dessin (assurée par la classe Dessin)
|
* - zone de dessin (assurée par la classe Dessin)
|
||||||
* - affichage du mot masqué
|
* - affichage du mot masqué
|
||||||
* - saisie d'une lettre (événement remonté via un handler)
|
* - saisie d'une lettre (les événements sont gérés dans Event)
|
||||||
*
|
*
|
||||||
* Aucune logique de jeu (choix/vérification du mot) n'est ici.
|
* Aucune logique de jeu ici.
|
||||||
*
|
* @version 1.5
|
||||||
* @version 1.0
|
* @author Adrien
|
||||||
* @author Adrien
|
* Date : 08-10-2025
|
||||||
* Date : 08-10-25
|
* Licence :
|
||||||
* Licence :
|
*/
|
||||||
*/
|
|
||||||
public class Fenetre {
|
public class Fenetre {
|
||||||
|
|
||||||
// --- Composants de l'interface (UI only) ---
|
// --- Composants de l'interface ---
|
||||||
private JFrame window;
|
private JFrame window;
|
||||||
private JLabel wordLabel;
|
private JLabel wordLabel;
|
||||||
private JTextField letterInput;
|
private JTextField letterInput;
|
||||||
private JButton sendButton;
|
private JButton sendButton;
|
||||||
private JPanel drawZone; // instance de Dessin
|
private JPanel drawZone; // instance de Dessin
|
||||||
|
|
||||||
// Handler externe pour la lettre soumise (fourni par la classe Partie / contrôleur)
|
// --- Constructeur ---
|
||||||
private Consumer<Character> onLetterSubmitted;
|
|
||||||
|
|
||||||
// --- Constructeur (orchestration courte) ---
|
|
||||||
public Fenetre() {
|
public Fenetre() {
|
||||||
setupWindow();
|
setupWindow();
|
||||||
JPanel root = createRoot();
|
|
||||||
|
JPanel root = new JPanel();
|
||||||
|
root.setLayout(new BoxLayout(root, BoxLayout.Y_AXIS));
|
||||||
window.setContentPane(root);
|
window.setContentPane(root);
|
||||||
|
|
||||||
drawZone = createDrawZone(); // -> new Dessin()
|
drawZone = new Dessin();
|
||||||
root.add(drawZone);
|
root.add(drawZone);
|
||||||
|
|
||||||
wordLabel = createWordLabel();
|
wordLabel = createWordLabel();
|
||||||
@@ -48,7 +46,6 @@ public class Fenetre {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// --- Initialisation fenêtre ---
|
// --- Initialisation fenêtre ---
|
||||||
/** Configure la fenêtre principale (titre, taille, fermeture). */
|
|
||||||
private void setupWindow() {
|
private void setupWindow() {
|
||||||
window = new JFrame("Jeu du Pendu");
|
window = new JFrame("Jeu du Pendu");
|
||||||
window.setSize(600, 600);
|
window.setSize(600, 600);
|
||||||
@@ -56,20 +53,7 @@ public class Fenetre {
|
|||||||
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
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 ---
|
// --- 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() {
|
private JLabel createWordLabel() {
|
||||||
JLabel label = new JLabel("_ _ _ _ _", SwingConstants.CENTER);
|
JLabel label = new JLabel("_ _ _ _ _", SwingConstants.CENTER);
|
||||||
label.setFont(new Font("Segoe UI", Font.BOLD, 32));
|
label.setFont(new Font("Segoe UI", Font.BOLD, 32));
|
||||||
@@ -78,7 +62,6 @@ public class Fenetre {
|
|||||||
return label;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Crée la zone de saisie (champ + bouton) et branche l'action. */
|
|
||||||
private JPanel createInputPanel() {
|
private JPanel createInputPanel() {
|
||||||
JPanel inputPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));
|
JPanel inputPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));
|
||||||
JLabel prompt = new JLabel("Entrez une lettre :");
|
JLabel prompt = new JLabel("Entrez une lettre :");
|
||||||
@@ -89,57 +72,27 @@ public class Fenetre {
|
|||||||
|
|
||||||
sendButton = new JButton("Envoyer");
|
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(prompt);
|
||||||
inputPanel.add(letterInput);
|
inputPanel.add(letterInput);
|
||||||
inputPanel.add(sendButton);
|
inputPanel.add(sendButton);
|
||||||
return inputPanel;
|
return inputPanel;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Partie <-> UI ---
|
// --- Getters pour Event ---
|
||||||
|
public JFrame getWindow() { return window; }
|
||||||
/** Définit le texte du mot affiché (ex: "_ _ A _ _") fourni par la classe Partie. */
|
public JTextField getLetterInput() { return letterInput; }
|
||||||
public void setWordDisplay(String maskedWord) {
|
public JButton getSendButton() { return sendButton; }
|
||||||
wordLabel.setText(maskedWord != null ? maskedWord : "");
|
public JLabel getWordLabel() { return wordLabel; }
|
||||||
}
|
public JPanel getDrawZone() { return drawZone; }
|
||||||
|
|
||||||
/** 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- Méthode principale de test ---
|
// --- Méthode principale de test ---
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
SwingUtilities.invokeLater(() -> {
|
||||||
Fenetre f = new Fenetre();
|
Fenetre f = new Fenetre();
|
||||||
f.setWordDisplay("_ _ _ _ _"); // placeholder
|
// On passe le handler directement ici (pas de setOnLetterSubmitted)
|
||||||
f.setOnLetterSubmitted(ch ->
|
new Event(f, ch ->
|
||||||
JOptionPane.showMessageDialog(null, "Lettre reçue : " + ch + " (sans logique de jeu)")
|
JOptionPane.showMessageDialog(f.getWindow(), "Lettre reçue : " + ch + " (sans logique de jeu)")
|
||||||
);
|
);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user