drawImage is not drawing
Asked Answered
G

1

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.

Grabble answered 4/1, 2013 at 2:7 Comment(4)
"Swing programs should override paintComponent() instead of overriding paint()."—Painting in AWT and Swing: The Paint Methods. Also, Swing GUI objects should be constructed and manipulated only on the event dispatch thread.Extravagance
Read the tutorials before doing this sort of coding, else you'll risk making all the wrong assumptions and creating non-functioning code like you've posted above.Fudge
ya ill take a look at the tutorialsGrabble
Take a look at Performing Custom Painting and Concurrency in Swing for some more useful tips.Ontology
S
1

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.

Scevo answered 4/1, 2013 at 2:14 Comment(1)
use double buffering to avoid flickering ... Swing components are double buffered by default ... not that one should avoid the subject as the default mechanism may not always meet ones needs though ;) +1 from meOntology

© 2022 - 2024 — McMap. All rights reserved.