我正在为班级做另一个Java项目。在此分配中,我们必须创建一个棋盘格,并在其中填充适当数量的棋盘格。我正确地建立了棋盘格,可以很好地显示,但是使用Graphics类绘制时很难。
这是我到目前为止的代码:
import javax.swing.*;
import java.awt.*;
public class Checkerboard extends JFrame {
//Define the default values for the separate checker pieces
private final int RED_PIECE = 0;
private final int BLACK_PIECE = 1;
/** Construct the default checker board */
public Checkerboard() {
this.setSize(600, 600);
this.setResizable(false);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setTitle("Checkerboard Lab");
this.setLayout(new GridLayout(8, 8));
this.setVisible(true);
for (int a=0; a<2; a++) {
for (int i=0; i<4; i++) {
add(new WhiteSpace());
add(new GraySpace(RED_PIECE));
}
for (int j=0; j<4; j++) {
add(new GraySpace(RED_PIECE));
add(new WhiteSpace());
}
}
for (int b=0; b<2; b++) {
for (int k=0; k<4; k++) {
add(new WhiteSpace());
add(new GraySpace(RED_PIECE));
}
for (int l=0; l<4; l++) {
add(new GraySpace());
add(new WhiteSpace());
}
}
for (int c=0; c<2; c++) {
for (int m=0; m<4; m++) {
add(new GraySpace());
add(new WhiteSpace());
}
for (int n=0; n<4; n++) {
add(new GraySpace(BLACK_PIECE));
add(new WhiteSpace());
}
}
for (int d=0; d<2; d++) {
for (int o=0; o<4; o++) {
add(new WhiteSpace());
add(new GraySpace(BLACK_PIECE));
}
for (int p=0; p<4; p++) {
add(new GraySpace(BLACK_PIECE));
add(new WhiteSpace());
}
}
}
/** White Space constructor */
public class WhiteSpace extends JPanel {
public WhiteSpace() {
setBackground(Color.WHITE); //Sets the panel's background color to white
}
}
/** Gray Space constructor */
/* GraySpace is a little different, since this color space is the only space that will be holding checker
* pieces. There is a default constructor to create a space without a checker piece on it, and another
* constructor that places either a red or black piece on the space, pending an optional parameter.*/
public class GraySpace extends JPanel {
//Initial variable for the checker piece
int checkerPiece;
//Default GraySpace constructor
public GraySpace() {
setBackground(Color.LIGHT_GRAY);
}
//The GraySpace constructor with the optional parameter to determine if it holds a checker piece
public GraySpace(int piece) {
this.checkerPiece = piece;
setBackground(Color.LIGHT_GRAY); //Sets the panel's background color to white
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
//Default width and height variables
int width = getWidth() -10;
int height = getHeight() - 10;
//This switch statement determines which checker piece type appears on the square
switch (checkerPiece) {
case RED_PIECE:
g.setColor(Color.RED);
g.fillOval(5, 5, width, height);
break;
case BLACK_PIECE:
g.setColor(Color.BLACK);
g.fillOval(5, 5, width, height);
break;
}
}
}
/** Initiate the Checker board */
public static void main(String[] args) {
JFrame checkerboard = new Checkerboard();
}
}
这很简单。我的Checkerboard类是JFrame的子类,我将彩色面板放在8x8的正方形中。这些面板是Checkerboard类的内部类,每个类都扩展了JPanel(分别为WhiteSpace和GraySpace)。由于GraySpace是唯一一个必须具有检查器的类,因此我认为我只是将Graphics代码放入GraySpace内部类中。
无论如何,对于我的问题:如何使用图形绘制图形?我知道我必须显式声明paintComponent()方法才能绘制圆,但是我不知道如何指定GraySpace的尺寸,这样它才能有效绘制。有什么建议吗?
编辑:新问题!
好吧,所以我确切地知道了如何在板上添加板块,并且效果很好。我的GraySpace内部类具有一个可选的构造函数,该构造函数采用
int
值,并从中确定将在GraySpace面板上显示的颜色。我测试了一下,它可以工作。但是,我的问题实际上是将棋子放在棋盘上。棋盘必须代表“默认”的棋盘游戏,其中所有可用的棋子都在棋盘上。因此,三行红色方格,三行黑色方格,两行空行将它们隔开。到目前为止,我有4个单独的
for
循环在板上一次绘制两行...但是它不能正常工作。有什么建议吗?以上是最新的源代码,代替了我以前的问题源代码。再次感谢您的任何建议! 最佳答案
在您所在的组件上调用getHeight
和getWidth
。由于paintComponent
是JPanel
类的成员,因此您可以直接调用getHeight
和getWidth
。
我对您的方法进行了其他一些更改。
不要调用this.paintComponent
,请调用基类(super
)
您需要在绘画之前设置颜色。
我敢打赌fillOval
是你想要的。
例如:
protected void paintComponent(Graphics g) {
int h = getHeight();
int w = getWidth();
super.paintComponent(g);
g.setColor(CHECKER_COLOR);
g.fillOval(w/2, h/2, w, h);
}
要获得额外的信誉,请启用抗锯齿功能,并使您的检查器看起来很棒!