【发布时间】:2021-10-14 09:51:35
【问题描述】:
我正在尝试自学更多有关 Java 图形的知识。为此,我正在尝试构建一个国际象棋游戏。我在制作董事会时遇到了第一个障碍。我的想法是,我将有一个名为“Square”的 JComponent 扩展,它将作为我的容器,用于存放棋盘方格的颜色和该方格上的棋子(如果有的话)。首先,我还没有尝试包含这件作品的任何表示,只是方形颜色。稍后我希望有一个抽象的“Pieces”类,它由代表所有不同类型的棋子的多个子类扩展,并根据需要将这些子类添加到每个 Square。
当我执行以下操作时,我只在左上角得到一个黑色方块。
ChessBoardTest.java
public class ChessBoardTest {
public static void main(String[] args) {
ChessBoard Board = new ChessBoard();
Board.Display();
}
}
ChessBoard.java
public class ChessBoard extends JFrame {
public static final int FRAME_WIDTH = 500;
public static final int FRAME_HEIGHT = 500;
// Declare instance variables
private Square[][] square = new Square[rows][cols];
private final static int rows = 8;
private final static int cols = 8;
public ChessBoard() {
}
public void Display() {
JPanel Board_Layout = new JPanel();
Board_Layout.setLayout(new GridLayout(8,8));
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
if((i+j) % 2 == 0) {
square[i][j] = new Square(1);
Board_Layout.add(square[i][j]);
} else {
square[i][j] = new Square(0);
Board_Layout.add(square[i][j]);
}
}
}
setTitle("Chess Mod");
setSize(FRAME_WIDTH, FRAME_HEIGHT);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(Board_Layout);
setVisible(true);
}
public void messageBox(String pMessage) {
JOptionPane.showMessageDialog(this, pMessage, "Message", JOptionPane.PLAIN_MESSAGE);
}
}
Square.java
public class Square extends JComponent {
private int color;
public Square(int c) {
this.color=c;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (this.color == 1) {
g.setColor(new Color(0,0,0));
} else {
g.setColor(new Color(255,255,255));
}
g.fillRect(this.getX(), this.getY(), this.getWidth(), this.getHeight());
}
}
【问题讨论】:
-
通常,您创建一个棋盘的逻辑模型,然后在单个绘图 JPanel 上绘制该逻辑模型。 Oracle 教程Performing Custom Painting 将向您展示如何操作。
-
1) “教自己更多关于 Java 图形的知识。为此,我正在尝试构建一个国际象棋游戏” 请注意,simple chessboard 可以完全使用标准组件。除非这是为了增加其他功能(例如,为棋子的移动设置动画),否则“自定义彩绘游戏”会有更好的选择。 2) 如果需要自定义绘画,通常使用
JPanel比使用JComponent更好。 3) 这里没有很好的例子来扩展JFrame。只需使用标准的“开箱即用”框架。 .. -
.. 4) 请参阅Detection/fix for the hanging close bracket of a code block 了解我无法再费心修复的问题。请edit问题在代码末尾关闭
}之前添加4个空格字符。