java2D перетаскивание пешек на шахматной доске

для школьного проекта я делаю шахматную доску в 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);

            }
        }
    }

вероятно, не самый чистый код для этого, если есть какие-либо предложения, чтобы сделать это лучше, предлагайте!

Теперь настоящая проблема, и мой вопрос заключается в том, что мы должны иметь возможность перетаскивать эти несколько фигур одновременно в другое место на доске, и я, честно говоря, понятия не имею, как это сделать.

Любая помощь, которую вы, ребята, можете мне дать, будет очень признательна!

Заранее спасибо!


person zeta    schedule 06.11.2011    source источник


Ответы (1)


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

Для примера этого, пожалуйста, ознакомьтесь с: ">добавление-jlabel-на-jpanel-скрывает-jpanel

person Hovercraft Full Of Eels    schedule 06.11.2011
comment
Я не думаю, что вы можете перетаскивать JPanel. - person toto2; 06.11.2011
comment
@toto: я согласен, он недоступен из коробки, но его можно добавить, если расширить, но на самом деле вам это не нужно. Просто используйте JLayeredPane и по щелчку переместите JLabel из JPanel вверх в слой перетаскивания JLayeredPane. См. мою ссылку выше для примера этого. - person Hovercraft Full Of Eels; 06.11.2011
comment
Я запустил ваш пример. Это вполне завершено; вы могли бы сделать ИИ тоже, пока вы были в нем. - person toto2; 06.11.2011
comment
совершенно потрясающе! Я не могу поверить, что не нашел этот пример раньше, когда искал примеры шахмат в java 2D. - person zeta; 06.11.2011