java2D棋盘上的棋子拖放

时间:2011-11-06 14:35:05

标签: java drag-and-drop java-2d

对于一个学校项目,我正在用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' } };

以下是创建普通pawn的方法的内容

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

            }
        }
    }

可能不是最干净的代码,如果有任何建议可以做得更好,请建议!

现在,真正的问题,我的问题是,我们必须能够将这些多个形状一次拖放到电路板上的另一个地方,而且老实说我根本不知道该怎么回事。< / p>

非常感谢你们给我的任何帮助!

提前致谢!

1 个答案:

答案 0 :(得分:2)

我建议不要使用图像,而是在程序开头创建一些BufferedImages,为棋子创建图像。然后将它们添加到ImageIcons(可以多次使用),并将它们添加到JLabel(不能)。因此,例如白方将为8个棋子提供8个JLabel,但是这些JLabel中的每一个都将使用相同的白色棋子ImageIcon。然后只需添加代表棋盘上每个单元格的JLabels JPanel。我给单元格JPanels一个GridBagLayout,这样就可以毫不费力地将JLabel添加到它们的中心。

有关此示例,请查看:does-adding-a-jlabel-to-a-jpanel-hide-the-jpanel