#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(). Другой вариант — нарисовать в aBufferedImage
. Ознакомьтесь с пользовательскими подходами к рисованию для получения дополнительной информации и рабочих примеров по этой теме.2. Теперь, когда я переопределяю paintComponent — ничего не меняется.. и да, я вызываю метод allBlocks.paint(), который перебирает все блоки в массиве, и вызываю его .paint();
3. Я знаю, что ничего не меняется, вам все равно нужно изменить свой код. Вы пропустили мое первое утверждение, которое является самым важным!!! Вы также пропустили пункт о чтении информации, найденной в ссылке.
4. это мой вопрос — как еще я мог бы перерисовать их все сразу?
Ответ №1:
Ваши кирпичные координаты x и y не должны быть статическими. Поскольку он статичен, все кирпичи имеют одно общее значение x и y (поэтому все кирпичи отображаются в одной и той же позиции)