Как нарисовать цветные круги в Java на JPanel? - PullRequest
1 голос
/ 26 сентября 2010

Я делаю еще один Java-проект для моего класса.В этом задании мы должны создать шахматную доску и заполнить ее соответствующим количеством шашек.Я правильно построил шахматную доску, которая хорошо отображается, но мне трудно использовать класс Graphics для рисования.

Вот код, который у меня есть:

import javax.swing.*;
import java.awt.*;

public class Checkerboard extends JFrame {
    //Define the default values for the separate checker pieces
    private final int RED_PIECE = 0;
    private final int BLACK_PIECE = 1;

    /** Construct the default checker board */
    public Checkerboard() {
        this.setSize(600, 600);
        this.setResizable(false);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setTitle("Checkerboard Lab");
        this.setLayout(new GridLayout(8, 8));
        this.setVisible(true);

        for (int a=0; a<2; a++) {
            for (int i=0; i<4; i++) {
                add(new WhiteSpace());
                add(new GraySpace(RED_PIECE));
            }
            for (int j=0; j<4; j++) {
                add(new GraySpace(RED_PIECE));
                add(new WhiteSpace());
            }
        }
        for (int b=0; b<2; b++) {
            for (int k=0; k<4; k++) {
                add(new WhiteSpace());
                add(new GraySpace(RED_PIECE));
            }
            for (int l=0; l<4; l++) {
                add(new GraySpace());
                add(new WhiteSpace());
            }
        }
        for (int c=0; c<2; c++) {
            for (int m=0; m<4; m++) {
                add(new GraySpace());
                add(new WhiteSpace());
            }
            for (int n=0; n<4; n++) {
                add(new GraySpace(BLACK_PIECE));
                add(new WhiteSpace());
            }
        }
        for (int d=0; d<2; d++) {
            for (int o=0; o<4; o++) {
                add(new WhiteSpace());
                add(new GraySpace(BLACK_PIECE));
            }
            for (int p=0; p<4; p++) {
                add(new GraySpace(BLACK_PIECE));
                add(new WhiteSpace());
            }
        }
    }

    /** White Space constructor */
    public class WhiteSpace extends JPanel {
        public WhiteSpace() {
            setBackground(Color.WHITE); //Sets the panel's background color to white
        }
    }

    /** Gray Space constructor */
    /* GraySpace is a little different, since this color space is the only space that will be holding checker
     * pieces. There is a default constructor to create a space without a checker piece on it, and another 
     * constructor that places either a red or black piece on the space, pending an optional parameter.*/
    public class GraySpace extends JPanel {
        //Initial variable for the checker piece
        int checkerPiece;

        //Default GraySpace constructor
        public GraySpace() {
            setBackground(Color.LIGHT_GRAY);
        }

        //The GraySpace constructor with the optional parameter to determine if it holds a checker piece
        public GraySpace(int piece) {
            this.checkerPiece = piece;
            setBackground(Color.LIGHT_GRAY); //Sets the panel's background color to white
        }

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            //Default width and height variables
            int width = getWidth() -10;
            int height = getHeight() - 10;

            //This switch statement determines which checker piece type appears on the square
            switch (checkerPiece) {
            case RED_PIECE:
                g.setColor(Color.RED);
                g.fillOval(5, 5, width, height);
                break;
            case BLACK_PIECE:
                g.setColor(Color.BLACK);
                g.fillOval(5, 5, width, height);
                break;
            }
        }
    }

    /** Initiate the Checker board */
    public static void main(String[] args) {
        JFrame checkerboard = new Checkerboard();
    }
}

Это довольнопрямо вперед.Мой класс шахматной доски - это подкласс JFrame, в который я помещаю цветные панели в квадрате 8x8.Панели являются внутренними классами класса Checkerboard, каждый из которых расширяет JPanel (WhiteSpace и GraySpace соответственно).Поскольку GraySpace является единственным классом, который должен содержать средство проверки, я подумал, что просто поместил бы код Graphics во внутренний класс GraySpace.

Во всяком случае, на мой вопрос: как мне использовать Graphicsнарисовать это?Я знаю, что должен явно объявить метод paintComponent (), чтобы нарисовать круг, но я понятия не имею, как задать размеры GraySpace, чтобы он рисовал эффективно.Любой совет?

РЕДАКТИРОВАТЬ: НОВЫЙ ВОПРОС!

Хорошо, поэтому я выяснил, как именно я буду добавлять фигуры на мою доску, и это прекрасно работает.Мой внутренний класс GraySpace имеет необязательный конструктор, который принимает значение int, и от этого определяет, какой цветовой фрагмент будет идти на панели GraySpace.Я проверил это, и оно работает.

Моя проблема, однако, на самом деле получить кусочки на шахматную доску.Доска должна представлять собой игру в шашки «по умолчанию», где все доступные фигуры находятся на доске.Итак, три ряда красных шашек, три ряда черных шашек с двумя пустыми рядами, разделяющими их.До сих пор у меня есть 4 отдельных цикла for, чтобы рисовать по два ряда за раз на доске ... Но это не работает должным образом.Любой совет?Последний исходный код приведен выше, заменяя мой старый исходный код вопросов.Еще раз спасибо за любой совет!

Ответы [ 2 ]

0 голосов
/ 28 сентября 2010

Одна вещь о ваших циклах for только для будущих знаний, когда вы определяете int i = 0, эта переменная существует только внутри этого цикла, поэтому вам не нужно использовать другую переменную a, b, c, d, e и т. д. в ваших циклах 4 for вы можете просто использовать i, j, k 4 раза.

Кроме того, я думаю, что ваши циклы добавляют гораздо больше фигур, чем вы хотите.

for (int a=0; a<2; a++) {             //2 (
   for (int i=0; i<4; i++) {          //    4
       add(new WhiteSpace());         //      (1 
       add(new GraySpace(RED_PIECE)); //         + 1)
   }                                  //  +                     
   for (int j=0; j<4; j++) {          //    4
       add(new GraySpace(RED_PIECE)); //      (1 
       add(new WhiteSpace());         //         + 1)
   }                                  //  )
}                                     //= 2 ( 4 * 2 + 4 * 2) = 32

В этом одном цикле вы добавляете 32 квадрата. Вы делаете это 4 раза. Это уже в два раза больше квадратов, которые вам нужны.

Самым простым решением является удаление 4 внешних петель. Тогда у тебя будет то, что ты хочешь.

0 голосов
/ 26 сентября 2010

Позвоните getHeight и getWidth на компоненте, в котором вы находитесь. Поскольку paintComponent является членом вашего JPanel класса, вы можете просто позвонить getHeight и getWidth напрямую.

Я сделал несколько других изменений в вашем методе.

  1. Не звоните this.paintComponent, вызовите базовый класс (super)
  2. Вынужно установить цвет перед рисованием.
  3. Держу пари, fillOval - то, что вы хотите.

Например:

protected void paintComponent(Graphics g) { 
    int h = getHeight();
    int w = getWidth();
    super.paintComponent(g); 
    g.setColor(CHECKER_COLOR);
    g.fillOval(w/2, h/2, w, h); 
} 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...