drawImage не рисует

так что в основном мой код работает

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();
   }
}

но ничего не рисуется, все, что я вижу, серое. кто знает в чем может быть проблема? я пытался сделать repaint() в конце метода draw(), но все равно ничего.


person user1459976    schedule 04.01.2013    source источник
comment
Программы Swing должны переопределять paintComponent(), а не paint(). AWT и Swing: методы рисования. Кроме того, объекты Swing GUI должны создаваться и управляться только на поток отправки событий.   -  person trashgod    schedule 04.01.2013
comment
Прочитайте учебные пособия, прежде чем приступать к такому кодированию, иначе вы рискуете сделать все неправильные предположения и создать неработающий код, как вы написали выше.   -  person Hovercraft Full Of Eels    schedule 04.01.2013
comment
Я плохо взгляну на учебники   -  person user1459976    schedule 04.01.2013
comment
Взгляните на Выполнение пользовательского рисования и Параллелизм в Swing и другие полезные советы.   -  person MadProgrammer    schedule 04.01.2013


Ответы (1)


Вы не должны самостоятельно управлять рисованием с помощью Swing в Java.

Вы должны позволить потоку EDT вызывать соответствующие методы перерисовки в своем собственном потоке. Это делается путем вызова JComponent paint(Graphics g). Теперь вы не должны переопределять этот метод, а вместо этого paintComponent(Graphics g).

Таким образом, вы должны переместить свой метод рисования из потока в соответствующий метод рисования:

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

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

Имейте в виду, что вы должны вызывать перерисовку с фиксированной частотой кадров и использовать двойную буферизацию, чтобы избежать мерцания.

Еще более простым решением было бы встроить что-то, уже подготовленное для такой работы, например фрейм Processing, который работает очень хорошо.

person Jack    schedule 04.01.2013
comment
use double buffering to avoid flickering ... Компоненты Swing по умолчанию имеют двойную буферизацию ... не то чтобы следует избегать этой темы, поскольку механизм по умолчанию может не всегда соответствовать вашим потребностям;) +1 от меня - person MadProgrammer; 04.01.2013