Maison >Java >javaDidacticiel >Comment créer une interface graphique d'échecs redimensionnable basée sur le swing en Java ?

Comment créer une interface graphique d'échecs redimensionnable basée sur le swing en Java ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-20 21:27:10629parcourir

How to Create a Resizable Swing-Based Chess GUI in Java?

Création d'une interface graphique d'échecs Swing robuste et redimensionnable

Swing, une bibliothèque Java pour créer des interfaces utilisateur graphiques (GUI), offre un cadre puissant pour créer des applications robustes et personnalisables. Dans cet article, nous nous concentrerons sur la création d'une interface graphique d'échecs basée sur Swing redimensionnable, répondant aux exigences suivantes :

  • Disposition de l'interface graphique :

    • Barre d'outils en haut avec des boutons pour Nouveau, Enregistrer, Restaurer, Démissionner et une étiquette de message.
    • Espace réservé pour fonctionnalités futures sur le côté gauche.
    • Échiquier avec des étiquettes pour les lignes et les colonnes.
    • Échiquier de forme carrée qui remplit l'espace disponible et conserve ses proportions lors de son redimensionnement.

Technique Approche :

  • GridLayout : Un GridLayout 9x9 fournit la structure de l'échiquier, y compris la première cellule d'une étiquette sans texte.
  • Tableau de boutons 8x8 : Pour simplifier la logique du jeu, nous maintenons un tableau de boutons 8x8 séparé pour le carrés de l'échiquier.
  • Fonctionnalité du clavier : L'utilisation de boutons pour les carrés de l'échiquier permet la gestion des événements du clavier et de la souris.
  • Échiquier de forme carrée : En utilisant une astuce impliquant GridBagLayout et l'interrogation des composants parents, nous maintenons un échiquier carré qui s'inscrit dans les limites disponibles. espace.
  • Images de pièces d'échecs : Nous utilisons des feuilles de sprite pour représenter les pièces d'échecs, offrant une flexibilité en termes de taille, de style et d'options de couleur.

Détails de mise en œuvre :

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.*;
import java.net.URL;
import javax.imageio.ImageIO;

public class ChessGUI {

    private final JPanel gui = new JPanel(new BorderLayout(3, 3));
    private JButton[][] chessBoardSquares = new JButton[8][8];
    private Image[][] chessPieceImages = new Image[2][6];
    private JPanel chessBoard;
    private final JLabel message = new JLabel("Chess Champ is ready to play!");
    private static final String COLS = "ABCDEFGH";

    // Chess piece types
    public static final int QUEEN = 0, KING = 1,
            ROOK = 2, KNIGHT = 3, BISHOP = 4, PAWN = 5;
    public static final int[] STARTING_ROW = {
        ROOK, KNIGHT, BISHOP, KING, QUEEN, BISHOP, KNIGHT, ROOK
    };

    // Player colors
    public static final int BLACK = 0, WHITE = 1;

    public ChessGUI() {
        initializeGui();
    }

    public final void initializeGui() {
        createImages();

        // Main GUI layout
        gui.setBorder(new EmptyBorder(5, 5, 5, 5));
        JToolBar tools = new JToolBar();
        tools.setFloatable(false);
        gui.add(tools, BorderLayout.PAGE_START);
        // Toolbar buttons
        Action newGameAction = new AbstractAction("New") {
            @Override
            public void actionPerformed(ActionEvent e) {
                setupNewGame();
            }
        };
        tools.add(newGameAction);
        tools.add(new JButton("Save")); // Implement later
        tools.add(new JButton("Restore")); // Implement later
        tools.addSeparator();
        tools.add(new JButton("Resign")); // Implement later
        tools.addSeparator();
        tools.add(message);

        gui.add(new JLabel("?"), BorderLayout.LINE_START);

        // Chess board layout
        chessBoard = new JPanel(new GridLayout(0, 9)) {
            @Override
            public final Dimension getPreferredSize() {
                Dimension d = super.getPreferredSize();
                Dimension prefSize = null;
                Component c = getParent();
                // Adjust size to fit within parent component
                if (c == null) {
                    prefSize = new Dimension((int) d.getWidth(), (int) d.getHeight());
                } else if (c != null && c.getWidth() > d.getWidth() && c.getHeight() > d.getHeight()) {
                    prefSize = c.getSize();
                } else {
                    prefSize = d;
                }
                int w = (int) prefSize.getWidth();
                int h = (int) prefSize.getHeight();
                // Square shape
                int s = (w > h ? h : w);
                return new Dimension(s, s);
            }
        };
        chessBoard.setBorder(new CompoundBorder(new EmptyBorder(8, 8, 8, 8), new LineBorder(Color.BLACK)));
        chessBoard.setBackground(new Color(204, 119, 34)); // Ochre color
        JPanel boardConstrain = new JPanel(new GridBagLayout());
        boardConstrain.setBackground(new Color(204, 119, 34)); // Ochre color
        boardConstrain.add(chessBoard);
        gui.add(boardConstrain);

        // Chess board squares
        Insets buttonMargin = new Insets(0, 0, 0, 0);
        for (int ii = 0; ii < chessBoardSquares.length; ii++) {
            for (int jj = 0; jj < chessBoardSquares[ii].length; jj++) {
                JButton b = new JButton();
                b.setMargin(buttonMargin);
                ImageIcon icon = new ImageIcon(new BufferedImage(64, 64, BufferedImage.TYPE_INT_ARGB));
                b.setIcon(icon);
                if ((jj % 2 == 1 && ii % 2 == 1) || (jj % 2 == 0 && ii % 2 == 0)) {
                    b.setBackground(Color.WHITE);
                } else {
                    b.setBackground(Color.BLACK);
                }
                chessBoardSquares[jj][ii] = b;
            }
        }

        // Initial chess board setup
        chessBoard.add(new JLabel(""));

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn