1

I don't have much experienc with swing/awt.

My problem is: I need to draw something like chessboard (NxN). In general I need to get access to every cell to make changes (when program is running e.g. I click button and something is happen with cells on that board). It will be greate if a Component let me to set in cell a Image.

I try to use GridLayout but I get nothing what satisfy me.

Do you have any idea how to simply resolve that problem?

David Kroukamp
  • 36,155
  • 13
  • 81
  • 138
user1055201
  • 159
  • 7
  • 16
  • 2
    You may wish to show us your GridLayout attempt, since if done right, this could work quite well, and if you've coded it wrong, by showing it to us, you allow us to inspect your code and quite possibly find out what you've done wrong and tell you how you can fix it. – Hovercraft Full Of Eels Jul 22 '12 at 16:22
  • 4
    I have to warn you that you already have 2 out of 5 votes to close this question (none from me yet), and so this question is at risk of being closed if you don't soon show us more information including the fruits of your efforts. – Hovercraft Full Of Eels Jul 22 '12 at 16:28

2 Answers2

3

I made a Chess game myself in Java back sometime and found the code I used.

So here is something to start you off:

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 to get you started.

David Kroukamp
  • 36,155
  • 13
  • 81
  • 138
1

There is actually quite a reasonable example online on roseindia.

Adriaan Koster
  • 15,870
  • 5
  • 45
  • 60