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

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

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

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

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

在roseindia网上有一个非常合理的例子 。

我曾经用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 AH 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 ie 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让你入门。