0

so this is basically how my code is working

class Main extends JFrame implements Runnable {

   public Main() {
      //init everything
   }

   public void start() {
      running = true;
      Thread thread = new Thread(this);
      thread.start();
   }

   public void run() {
      while(running) {
         render();
      }
   }

   public void render() {
      Image dbImage  = createImage(width, height);
      Graphics dbg = dbImage.getGraphics();
      draw(dbg);
      Graphics g = getGraphics();
      g.drawImage(dbImage, 0, 0, this);
      g.dispose();
   }

   public void draw(Graphics g) {
      for(int y=0; y < map.length; y++) {
         for(int x=0; x < map.length; x++) {
            g.drawImage(map.map[x + y* map.MAP_DIM], x*MAP_DIM, y*MAP_DIM, this);
         }
      }
   }

   public static void main(String... args) {
      Main main = new Main();
      main.start();
   }
}

but nothing gets drawn, all i see is gray. anyone know what the problem could be? i tried doing repaint() at the end of the draw() method, but still nothing.

4

1 に答える 1

1

SwinginJavaを使用して自分で描画を管理することは想定されていません。

EDTスレッドに、独自のスレッドによって適切なrepaintメソッドを呼び出させる必要があります。これは、JComponentのを呼び出すことによって行われpaint(Graphics g)ます。ここで、そのメソッドをオーバーライドするのではなく、paintComponent(Graphics g)代わりにオーバーライドする必要があります。

したがって、描画メソッドをスレッドから適切な描画メソッドに移動する必要があります。

public void run() {
  while (running)
    repaint();
}

public void paintComponent(Graphics g) {
  draw(g);
}

固定フレームレートで再描画を呼び出し、ちらつきを避けるためにダブルバッファリングを使用する必要があることに注意してください。

さらに簡単な解決策は、非常にうまく機能する処理フレームなど、この種の作業用にすでに準備されているものを埋め込むことです。

于 2013-01-04T02:14:34.583 に答える