【问题标题】:java2D pawns on a chessboard drag and dropjava2D棋盘上的棋子拖放
【发布时间】:2011-12-23 02:02:39
【问题描述】:

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

            }
        }
    }

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

现在,真正的问题,我的问题是,我们必须能够一次将这些多个形状拖放到板上的另一个位置,老实说,我完全不知道如何解决这个问题。

如果你们能给我任何帮助,我们将不胜感激!

提前致谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我认为您不能拖放 JPanel。
    • @toto:我同意,它不是开箱即用的,但如果扩展它可以添加,但实际上你不需要。只需使用 JLayeredPane,然后单击将 JLabel 从 JPanel 向上移动到 JLayeredPane 的拖动层中。有关此示例,请参见我上面的链接。
    • 我运行了您的示例。它非常完整;你也可以在做 AI 的时候做出来。
    • 绝对惊人!我不敢相信我之前在 java 2D 中寻找一些国际象棋示例时没有找到那个示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    相关资源
    最近更新 更多