用于绘制棋盘的Java swing / awt组件

时间:2012-07-22 16:19:42

标签: java swing awt

我对swing / awt没有多少体验。

我的问题是: 我需要画一些像棋盘(NxN)的东西。 一般来说,我需要访问每个单元格来进行更改(当程序运行时,例如我单击按钮,并且该板上的单元格会发生某些事情)。 如果Component允许我在单元格Image中设置,那将会很有用。

我尝试使用GridLayout,但我什么都没有让我满意。

你知道如何简单地解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

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

所以这是让你开始的事情:

ChessBoardTest:

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();
        }
    }
}

Board.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让你入门。

答案 1 :(得分:1)

Roseindia实际上有reasonable example在线。