我正在为一个项目制作一个棋盘,我必须使用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)
我不知道如何解决此错误。感谢您的帮助:))
答案 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]);
,否则你将用按钮替换内容窗格......因为只能有一个内容窗格,你只需要得到一个按钮......