Генератор графического интерфейса заново генерирует мой лабиринт, если я изменяю текущие размеры окна (Java) - PullRequest
0 голосов
/ 30 января 2012

С учетом следующего кода:

class Game() {


   private Shell shell;

    public Game(Display display,int level) 
    {



        shell.addPaintListener(new ExmaplePaintListener());

        shell.setText("Basic shapes");
        shell.setSize(900,900);
        shell.setLocation(45, 45);
        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }
}

Слушатель:

   private class ExmaplePaintListener implements PaintListener {

        public void paintControl(PaintEvent e) {



            drawMaze(e);
            placeTreasuresInMaze2(e);
            e.gc.dispose();



        }
    }

и метод рисования лабиринта

  private void drawMaze(PaintEvent e) {

// this method creates a new maze and draw it using GUI Java 

}

Моя проблема в том, что после того, как окно лабиринта создано, если я использую мышь, чтобы изменить размеры окна, то метод drawMaze создает новый лабиринт в текущем окне. Это явно ошибка, так где же моя ошибка? может быть что-то с Constructor класса Game?

С уважением Рон

1 Ответ

0 голосов
/ 30 января 2012

В общем случае событие рисования происходит после события изменения размера.Поэтому, если вы изменяете размер с помощью мыши или даже программно, будет вызвана функция drawMaze().Я думаю, что вы не должны создавать лабиринт в drawMaze() или, по крайней мере, делать ленивую инициализацию.Это потому, что лабиринт будет создаваться при каждом рисовании окна, что происходит каждый раз, когда вы изменяете размер окна, перемещаете окно, скрываете какую-то часть окна, меняете фокус и т. Д.D.

РЕДАКТИРОВАТЬ: событие рисования предполагает, что дисплей изменился, и что изменение, вероятно, повлияет на часть экрана, на котором вы рисуете.Так мало вещей:

  • Во время рисования вы хотите сделать только одно: рисовать.Так что не называйте сборщик мусора.Вообще, вызывать Gc не очень хорошая идея, и более того, в Слушателе это просто сокрушит производительность.
  • Событие не изменит состояние вашего Лабиринта.Таким образом, вы должны представлять свой лабиринт, используя состояние.Одна часть закреплена, как стены, другая сторона изменчива, как положение агента внутри лабиринта.Каждый раз, когда вы изменяете состояние, вы запрашиваете перерисовку.
  • Если пропустить событие рисования, экран будет пустым.

Например, если ваш лабиринт слишком велик, чтобы поместиться на экране, вы используете событие рисования для рисования только одной части и т. Д.

...