Java2D棋盘上的棋子拖放

3

为了一个学校项目,我正在使用Java制作一个国际象棋棋盘。

有一些限制,比如我们不能使用图像来表示任何兵种。我们需要用多个形状来制作一个兵。

例如,我用一个圆和一个圆角正方形制作了一个兵。以下是一些代码片段。这是定义为字符集的棋盘,每个字符代表棋盘上的一个格子。

  private char[][] board = new char[][] { { 'T', 'H', 'B', 'Q', 'K', 'B', 'H', 'T' }, 
                                      { 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P' }, 
                                      { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' }, 
                                      { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' }, 
                                      { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' }, 
                                      { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' }, 
                                      { 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P' }, 
                                      { 'T', 'H', 'B', 'Q', 'K', 'B', 'H', 'T' } };

以下是创建普通棋子的方法内容:

  for(int i=0; i<8; i++) {
        for(int j=0; j<8;j++) {

            if(board[j][i] == 'P') {
                Ellipse2D.Double ellipse = new Ellipse2D.Double(i * getWidth() / 8 + 20,
                                                                j * getHeight() / 8 + 20,
                                                                getWidth()/8 - 40,getHeight()/8 - 40);

                g2d.setPaint(new GradientPaint(i * getWidth() / 8 , j * getHeight() / 8 + 20, Color.orange, i * getWidth() / 8, j * getHeight() / 8 + 60,
                         Color.pink, false) );

                g2d.fill(ellipse);

                RoundRectangle2D.Double roundRect = new RoundRectangle2D.Double(i*getWidth() / 8 + 20,
                                                                                j*getHeight() / 8 + 10,
                                                                                getWidth()/8 - 40, getHeight()/8-70,5,5);

                g2d.setPaint(new GradientPaint(i * getWidth() / 8 , j * getHeight() / 8 + 20, new Color(20,20,150), i * getWidth() / 8, j * getHeight() / 8 + 60,
                        new Color(20, 20, 100), false) );

                g2d.fill(roundRect);

            }
        }
    }

可能这不是最干净的代码来实现它,如果有更好的建议,请提出!

现在,真正的问题和我的问题是,我们必须能够一次性拖放这些多个形状到面板上的另一个位置,但我真的不知道如何处理。

希望您能给我提供任何帮助,将不胜感激!

提前致谢!

1个回答

2
我建议不要使用图片,而是在程序开始时创建几个BufferedImages来为棋子创建图像。然后将它们添加到ImageIcons中(可以重复使用),并将这些添加到JLabels中(不能重复使用)。例如,白色方将有8个JLabel代表8个兵,但每个JLabel都将使用相同的白色兵ImageIcon。然后只需将JLabels JPanel添加到表示棋盘上每个单元格的JPanel中。我会给单元格JPanels一个GridBagLayout,这样JLabels就会被添加到它们的中心,而不需要任何麻烦。
关于此示例,请查看:does-adding-a-jlabel-to-a-jpanel-hide-the-jpanel

我认为你不能拖放一个JPanel。 - toto2
@toto:我同意,它不是开箱即用的,但如果扩展了它就可以添加,但实际上你并不需要。只需使用JLayeredPane,在单击时将JLabel从JPanel移动到JLayeredPane的拖动层中。请参见我上面的链接以获取此示例。 - Hovercraft Full Of Eels
我运行了你的示例。它相当完整;你本可以在此基础上制作AI。 - toto2
绝对惊人!我简直不敢相信我以前在查找Java 2D中的一些棋类示例时没有找到那个例子。 - zeta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接