java swing/awt组件绘制棋盘

标签 java swing awt

<分区>

我对 swing/awt 没有太多经验。

我的问题是: 我需要画棋盘(NxN)之类的东西。 一般来说,我需要访问每个单元格以进行更改(当程序运行时,例如我单击按钮,该板上的单元格发生了一些事情)。 如果 Component 让我在单元格中设置 Image 就更好了。

我尝试使用 GridLayout 但我没有得到令我满意的东西。

您知道如何简单地解决该问题吗?

最佳答案

我以前用 Java 自己做了一个国际象棋游戏,找到了我使用的代码。

所以这里有一些东西可以让你开始:

棋盘测试:

public class ChessBoardTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            Image blackBlock=ImageIO.read(new File("c:/bblock.jpg"));
            Image whiteBlock=ImageIO.read(new File("c:/wblock.jpg"));

            Board board = new Board(whiteBlock,blackBlock);

            //add pieces to board
            board.addPiece(new ImageIcon("c:/castle.jpg"), "A1");//just one example

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

棋盘.java:

import java.awt.*;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/*
 * @author David Kroukamp
 */
public class Board extends JFrame {

    //intialize variables
    private Image boardImage1;
    private Image boardImage2;
    //intialize components
    private JPanel centerPanel = new JPanel();
    private JPanel southPanel = new JPanel();
    private JPanel westPanel = new JPanel();
    //initialze arrays to hold panels and images of the board
    private JLabel[] labels = new JLabel[64];
    private ImagePanel[] panels = new ImagePanel[64];

    public Board(Image boardImage1, Image boardImage2) {
        this.boardImage1 = boardImage1;
        this.boardImage2 = boardImage2;
        createAndShowGUI();//call method to create gui
    }

    private void createAndShowGUI() {
        setTitle("Chess board example");

        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        addComponentsToPane(getContentPane());

        setSize(800, 600);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    /**
     * Adds all the necessary components to the content pane of the JFrame, and
     * adds appropriate listeners to components.
     */
    private void addComponentsToPane(Container contentPane) {

        GridLayout gridLayout = new GridLayout(8, 8);
        centerPanel.setLayout(gridLayout);

        //call mehod to add labels to south panel
        addLabelsToSouthPanel();
        //call method to add oanels to west panel
        addLabelsToWestPanel();
        //call method to add panels and labels to the center panel which holds the board
        addPanelsAndLabels();
        //add all panels to frame
        contentPane.add(centerPanel, BorderLayout.CENTER);
        contentPane.add(southPanel, BorderLayout.SOUTH);
        contentPane.add(westPanel, BorderLayout.WEST);
    }

    private void addLabelsToSouthPanel() {
        GridLayout gridLayout = new GridLayout(0, 8);

        southPanel.setLayout(gridLayout);
        JLabel[] lbls = new JLabel[8];
        String[] label = {"A", "B", "C", "D", "E", "F", "G", "H"};

        for (int i = 0; i < 8; i++) {
            lbls[i] = new JLabel(label[i] + "");
            southPanel.add(lbls[i]);
        }
    }

    private void addLabelsToWestPanel() {
        GridLayout gridLayout = new GridLayout(8, 0);

        westPanel.setLayout(gridLayout);
        JLabel[] lbls = new JLabel[8];
        int[] num = {8, 7, 6, 5, 4, 3, 2, 1};
        for (int i = 0; i < 8; i++) {
            lbls[i] = new JLabel(num[i] + "");
            westPanel.add(lbls[i]);
        }
    }

    private void addPanelsAndLabels() {

        //call methd to create panels with backgound images and appropriate names
        addPanelsAndImages();

        for (int i = 0; i < panels.length; i++) {
            labels[i] = new JLabel();

            //used to know the postion of the label on the board
            labels[i].setName(panels[i].getName());

            panels[i].add(labels[i]);

            //adds panels created in addPanelsAndImages()
            centerPanel.add(panels[i]);
        }
    }

    //this method will create panels with backround images of chess board and set its name according to 1-8 for rows and A-H for coloumns
    private void addPanelsAndImages() {
        int count = 0;
        String[] label = {"A", "B", "C", "D", "E", "F", "G", "H"};
        int[] num = {8, 7, 6, 5, 4, 3, 2, 1};

        for (int row = 0; row < 8; row++) {
            for (int col = 0; col < 8; col++) {
                if ((col + row) % 2 == 0) {//even numbers get white pieces
                    panels[count] = new ImagePanel(boardImage1);
                } else {//odd numbers get black pieces
                    panels[count] = new ImagePanel(boardImage2);
                }

                panels[count].setName(label[col] + num[row]);
                count++;
            }
        }
    }

    //method sets image of a label at a certain position in the board according to the block name i.e D4
    public void addPiece(ImageIcon img, String block) {
        for (int s = 0; s < labels.length; s++) {
            if (labels[s].getName().equalsIgnoreCase(block)) {
                labels[s].setIcon(img);
            }
        }
    }

//nested class used to set the background of frame contenPane
    class ImagePanel extends JPanel {

        private Image image;

        /**
         * Default constructor used to set the image for the background for the
         * instance
         */
        public ImagePanel(Image img) {
            image = img;
        }

        @Override
        protected void paintComponent(Graphics g) {
            //draws image to background to scale of frame
            g.drawImage(image, 0, 0, null);
        }
    }
}

HTH 让您入门。

关于java swing/awt组件绘制棋盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11601926/

相关文章:

java - 如何将二维字符串数组保存到 sql 数据库中?

java - JTable 未显示超过 5 列

java - 查看 JButton 是否从父类中单击

java - 将 BufferedImage 像素数据转换为可读输出?

java - 如何使用 Java 驱动程序 (2.0.2,3.1) 和 cassandra 3.7 在 java 中使用 DCAwareRoundRobinPolicy

java - 加入时有额外条件的疯狂 hibernate 标准?

java - 为什么我的背景颜色在 JFrame 中不显示?

java - 刷新 JPanel 以显示 JList 中添加的组件

绘制函数中的 Java 音频

java - 哈希轮计时器 #1 的守护线程是什么?