Java: не удается нарисовать () каждый элемент из массива

#java #swing

#java #swing

Вопрос:

Я пишу игру, в которой мне нужно рисовать кирпичи случайного цвета. Это мой прогресс на данный момент. У меня есть класс Brick, AllBricks и переопределенный метод рисования для JPanel :

 private static class Brick {
    static int x;
    static int y;
    static Color color;

    Brick(int _x, int _y, Color _color){
        x = _x;
        y = _y;
        color = _color;
    }

    void paint(Graphics g) {
        g.setColor(Color.WHITE);
        g.drawRoundRect(x, y, BRICK_SIZE, BRICK_SIZE, BRICK_ARC_SIZE, BRICK_ARC_SIZE);
        g.setColor(color);
        g.fillRoundRect(x   1, y   1, BRICK_SIZE-2, BRICK_SIZE-2, BRICK_ARC_SIZE-1, BRICK_ARC_SIZE-1);
    }
private static class AllBricks {
    private ArrayList<Brick> bList = new ArrayList<>();

    AllBricks(){ bList.clear(); }

    void add (Brick b){ bList.add(b); }

    void paint(Graphics g) {
        if(bList.size()>0) {
            for (Brick brick : bList) brick.paint(g);
        }
    }
}
private static class GameField extends JPanel {
    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        allBricks.paint(g);
    }
}
  

И теперь, когда я вызываю свой основной цикл, добавляя новые блоки и пытаясь их нарисовать, я вижу только последний добавленный блок, но не все из них…

 private void loop()
{
    while (true) {
        delay.wait(1000);

        Brick b1 = new Brick(random.nextInt(WIN_WIDTH - BRICK_SIZE), random.nextInt(WIN_HEIGHT - BRICK_SIZE), COLORS.get(random.nextInt(COLORS.size() - 1)));
        allBricks.add(b1);
        mainField.repaint();
    }
}
  

Не могли бы вы, пожалуйста, помочь мне сохранить ранее нарисованные блоки на экране?

Комментарии:

1. Can you, please, help me save previously painted blocks on the screen? — вам нужно перекрашивать все кирпичи каждый раз, когда компонент перекрашивается. Кроме того, вы должны переопределять paintComponent(...) панель, а не paint(). Другой вариант — нарисовать в a BufferedImage . Ознакомьтесь с пользовательскими подходами к рисованию для получения дополнительной информации и рабочих примеров по этой теме.

2. Теперь, когда я переопределяю paintComponent — ничего не меняется.. и да, я вызываю метод allBlocks.paint(), который перебирает все блоки в массиве, и вызываю его .paint();

3. Я знаю, что ничего не меняется, вам все равно нужно изменить свой код. Вы пропустили мое первое утверждение, которое является самым важным!!! Вы также пропустили пункт о чтении информации, найденной в ссылке.

4. это мой вопрос — как еще я мог бы перерисовать их все сразу?

Ответ №1:

Ваши кирпичные координаты x и y не должны быть статическими. Поскольку он статичен, все кирпичи имеют одно общее значение x и y (поэтому все кирпичи отображаются в одной и той же позиции)