0

给定以下代码:

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

问候罗恩

4

1 回答 1

0

通常,绘制事件发生在调整大小事件之后。因此,如果您使用鼠标甚至以编程方式调整大小,则将drawMaze()调用该函数。我认为您不应该在 中创建迷宫drawMaze(),或者至少进行延迟初始化。这是因为每次绘制窗口时都会创建一个迷宫,每次调整窗口大小、移动窗口、隐藏窗口的某些部分、更改焦点等时都会发生这种情况......这是很多迷宫: D.

编辑:绘画事件建议您显示已更改,并且更改可能会影响您正在绘画的屏幕部分。这么几件事:

  • 在绘画活动中,您只想做一件事:绘画。所以不要叫垃圾回收。一般来说,调用 Gc 并不是一个好主意,而且在 Listener 中它只会破坏性能。
  • 该事件不会改变迷宫的状态。所以你应该用一个状态来代表你的迷宫。一部分是固定的,就像墙壁一样,另一边是可变的,就像迷宫内的特工位置一样。每次修改状态时,都会要求重新绘制。
  • 如果您跳过绘画事件,屏幕将是空白的。

例如,如果您的迷宫太大而无法在屏幕上显示,您可以使用绘制事件仅绘制一个部分,等等。

于 2012-01-30T10:37:03.960 回答