如何在JPanel上用Java绘制彩色圆圈?

时间:2010-09-25 20:42:27

标签: java user-interface swing

我正在为我的班级做另一个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内部类中。

无论如何,对于我的问题:我如何使用Graphics绘制它?我知道我必须显式声明paintComponent()方法以绘制圆形,但我没有任何线索如何指定GraySpace的尺寸以便有效地绘制。有什么建议吗?

编辑:新问题!

好吧,所以我确切地想出了我将如何在我的电路板上添加碎片,这非常有效。我的GraySpace内部类有一个可选的构造函数,它接受一个int值,并从中确定GraySpace面板上的颜色块。我测试了它,它确实有效。

然而,我的问题实际上是将棋子放到棋盘上。董事会必须代表一个“默认”棋盘游戏,所有可用的棋子都在棋盘上。因此,三排红色检查器,三排黑色检查器,两排空行将它们分开。到目前为止,我有4个独立的for循环在板上一次绘制两行...但它不能正常工作。有什么建议?最新的源代码在上面,取代了我的旧问题源代码。再次感谢您的任何建议!

2 个答案:

答案 0 :(得分:0)

在您所在的组件上致电getHeightgetWidth。由于paintComponent是您JPanel课程的成员,因此您只需拨打getHeight即可getWidth直接。

我对你的方法进行了其他一些修改。

  1. 请勿致电this.paintComponent,请致电基类(super
  2. 您需要在绘制前设置颜色。
  3. 我打赌fillOval就是你想要的。
  4. 例如:

    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); 
    } 
    

    要获得额外的功劳,请启用抗锯齿功能,让你的棋子看起来很棒!

答案 1 :(得分:0)

关于for循环的一件事只是为了将来的知识,当你定义int i = 0时,该变量只存在于该循环中,所以你不需要使用不同的变量a,b,c,d,e在你的4 for循环中,你可以简单地使用i,j,k 4次。

另外,我认为你的循环添加了比你想要的更多的东西。

for (int a=0; a<2; a++) {             //2 (
   for (int i=0; i<4; i++) {          //    4
       add(new WhiteSpace());         //      (1 
       add(new GraySpace(RED_PIECE)); //         + 1)
   }                                  //  +                     
   for (int j=0; j<4; j++) {          //    4
       add(new GraySpace(RED_PIECE)); //      (1 
       add(new WhiteSpace());         //         + 1)
   }                                  //  )
}                                     //= 2 ( 4 * 2 + 4 * 2) = 32

在这一个循环中,您将添加32个方块。你这样做了4次。这已经是你需要的两倍的方格。

最简单的解决方案是移除4个外环。然后你会得到你想要的东西。