import javax.swing.*; import java.awt.*; /** * La classe abstraite SudokuUI est une interface graphique pour afficher et interagir avec une grille de Sudoku. * Elle fournit les méthodes de base pour la création de l'interface utilisateur. */ public abstract class SudokuUI extends JFrame { /** * La grille de Sudoku associée à l'interface utilisateur. */ protected Sudoku sudoku; /** * Tableau bidimensionnel de boutons représentant les cellules de la grille de Sudoku. */ protected JButton[][] buttons; /** * Constructeur de la classe SudokuUI. * @param sudoku La grille de Sudoku à afficher et à interagir. */ public SudokuUI(Sudoku sudoku) { this.sudoku = sudoku; this.buttons = new JButton[9][9]; setTitle(getTitleText()); setDefaultCloseOperation(EXIT_ON_CLOSE); JPanel gridPanel = new JPanel(new GridLayout(9, 9)); gridPanel.setBackground(Color.WHITE); gridPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Création des boutons de la grille createGridButtons(gridPanel); // Calcul de la taille préférée de la fenêtre en fonction de la taille de la grille int preferredSize = 50 * 9; // 50 est la taille approximative d'un bouton gridPanel.setPreferredSize(new Dimension(preferredSize, preferredSize)); add(gridPanel); pack(); // Redimensionne automatiquement la fenêtre pour s'adapter à la taille du panneau setLocationRelativeTo(null); setVisible(true); } /** * Méthode abstraite permettant d'obtenir le texte du titre de l'interface utilisateur. * @return Le texte du titre. */ protected abstract String getTitleText(); /** * Méthode pour créer les boutons de la grille de Sudoku. * @param gridPanel Le panneau de la grille où les boutons seront ajoutés. */ protected void createGridButtons(JPanel gridPanel) { Grid grid = sudoku.getGrid(); // Obtenez la grille à partir de Sudoku for (int row = 0; row < 9; row++) { for (int col = 0; col < 9; col++) { JButton button = new JButton(); button.setFont(new Font("Arial", Font.BOLD, 24)); button.setContentAreaFilled(false); button.setBorder(BorderFactory.createLineBorder(Color.BLACK)); button.setMinimumSize(new Dimension(50, 50)); // Taille minimale des boutons // Ajout de bordures plus épaisses pour délimiter les carrés de 3x3 if ((row + 1) % 3 == 0 && (col + 1) % 3 == 0) { button.setBorder(BorderFactory.createMatteBorder(1, 1, 3, 3, Color.BLACK)); } else if ((row + 1) % 3 == 0) { button.setBorder(BorderFactory.createMatteBorder(1, 1, 3, 1, Color.BLACK)); } else if ((col + 1) % 3 == 0) { button.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 3, Color.BLACK)); } button.addActionListener(new SudokuButtonListener(row, col, sudoku, buttons)); gridPanel.add(button); buttons[row][col] = button; // Mettez à jour le texte des boutons avec les valeurs de la grille Sudoku int value = grid.getCell(row, col).getValue(); buttons[row][col].setText(value == 0 ? "" : String.valueOf(value)); } } } }