user1459976
user1459976

Reputation: 207

drawImage is not drawing

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.

Upvotes: 0

Views: 5545

Answers (1)

Jack
Jack

Reputation: 133577

You are not supposed to manage drawing by yourself with Swing in Java.

You must let the EDT thread call the appropriate repaint methods by its own thread. This is done by invoking JComponent's paint(Graphics g). Now you shouldn't override that method but paintComponent(Graphics g) instead.

So you should move your draw method from the thread to the appropriate draw method:

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

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

Mind that you should call the repaint at a fixed frame rate and use double buffering to avoid flickering.

An even simpler solution would be to embed something already prepared for this kind of work, like a Processing frame, which works very well.

Upvotes: 1

Related Questions