用JButtons制作棋盘

时间:2014-03-25 06:07:00

标签: java swing nullpointerexception jbutton

我正在为一个项目制作一个棋盘,我必须使用JButtons。我正试着用每块瓷砖的空白图像设置电路板,这是我的代码:

驱动程序

public class Driver
{
  public static void main (String[] args)
  {
    new ChessBoard();
  }
}

ChessSquare

import javax.swing.*;
import java.awt.*;

public class ChessSquare 
{
  public ImageIcon pieceImage;
  /** The square's location */
  private int xCoord;
  private int yCoord;

  /** Constructor for the squares */
  public ChessSquare(ImageIcon thePieceImage, int theXCoord, int theYCoord)
  {
    pieceImage = thePieceImage;
    xCoord = theXCoord;
    yCoord = theYCoord;
  }

  public int getXCoord()
  {
    return xCoord;
  }

  public int getYCoord()
  {
    return yCoord;
  }
}

器ChessBoard

public class ChessBoard 
{
  public ChessBoard()
  {
  JFrame board = new JFrame();
  board.setTitle("Chess Board!");
  board.setSize(500,500);
  board.setLayout(new GridLayout(8,8));

  JPanel grid[][] = new JPanel[8][8];

  ImageIcon empty = new ImageIcon("/pieces/EmptySquare.jpg");

  for(int x = 0; x<8; x++)
  {
    for(int y = 0; y<8; y++)
    {
      ChessSquare s = new ChessSquare(empty, x, y);
      JButton square = new JButton(s.pieceImage);
      grid[x][y].add(square);
      board.setContentPane(grid[x][y]);
    }
  }
  board.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  board.setVisible(true);
  }
}

我的代码编译得很好但是当我运行它时我得到了这个错误:

  

线程“main”中的异常java.lang.NullPointerException at   ChessBoard。(ChessBoard.java:23)在Driver.main(Driver.java:8)

我不知道如何解决此错误。感谢您的帮助:))

2 个答案:

答案 0 :(得分:3)

grid[x][y].add(square);中,您实际上正在调用JPanel.add(),因为数组中的每个元素都是JPanel。

所以错误是因为grid[x][y]仍然null如果您在其上调用方法,则会获得NullPointerException,例如add()

您想要分配值,因为您使用的是数组

grid[x][y] = square;

答案 1 :(得分:3)

可能的原因之一是ImageIcon empty = new ImageIcon("/pieces/EmptySquare.jpg"); ......

图片的路径表明您使用的是嵌入式资源,但ImageIcon(String)将值视为文件,您无法使用嵌入资源执行此操作,但它们并非如此文件。

相反,您需要使用更像ImageIcon empty = new ImageIcon(getClass().getResource("/pieces/EmptySquare.jpg"));的内容。

就个人而言,我建议您使用ImageIO.read(getClass().getResource("/pieces/EmptySquare.jpg")),因为如果由于某种原因无法加载资源,而不是以静默方式失败,则会引发异常。

grid[x][y].add(square);也没有成功,因为您没有为grid[x][y]分配任何内容

grid[x][y] = new JPanel();
grid[x][y].add(square);

可能会更好地工作,但在做类似事情时,我不知道你为什么要这样做......

JButton grid[][] = new JButton[8][8];

//...

grid[x][y] = square;

对于你想要实现的目标似乎更合乎逻辑......

<强>更新...

而不是board.setContentPane(grid[x][y]);你应该使用board.add(grid[x][y]);,否则你将用按钮替换内容窗格......因为只能有一个内容窗格,你只需要得到一个按钮......