java2D пешки на шахматной доске перетащить - PullRequest
3 голосов
/ 06 ноября 2011

для школьного проекта, я делаю шахматную доску в Яве.

были определенные ограничения: мы не можем использовать изображения ни для одной из пешек. Нам нужно было сделать пешку из нескольких фигур.

Например, у меня есть пешка, сделанная из круга и закругленного квадрата. Вот некоторые фрагменты кода. Эта доска определяется как набор символов, каждый из которых представляет собой чек на доске

  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 голосов
/ 06 ноября 2011

Я бы предложил не использовать изображение, а вместо этого создать несколько BufferedImages в начале вашей программы, которая создает изображения для ваших шахматных фигур.Затем добавьте их в ImageIcons (которые можно использовать более одного раза) и добавьте их в JLabels (что не может).Так, например, на белой стороне будет 8 JLabels для 8 пешек, но каждый из этих JLabels будет использовать одну и ту же белую пешку ImageIcon.Затем просто добавьте JLabels JPanels, представляющий каждую ячейку на шахматной доске.Я бы дал ячейке JPanels GridBagLayout, чтобы JLabels были добавлены в их центр без суеты.

В качестве примера, пожалуйста, проверьте: do-добавление-a-jlabel-к-а-JPanel-прятки заместитель JPanel

...