2011-12-11 2 views
2

Вот мой код:Как остановить отображение мерцания при рисовании?

public class Game extends JComponent implements Runnable { 

    World w = null; 
    Keyboard keyboard = null; 

    Thread game = null; 

    /** The constructor. I would like to initialize here */ 
    public Game(){ 
     // Create and set up the frame 
     JFrame frame = new JFrame("My Game"); 
     frame.setSize(500, 700); 
     frame.setLocationRelativeTo(null); 
     frame.add(this); 
     frame.setVisible(true); 
     world = new World(); 
     keyboard = new KeyBoard(this); 
     game = new Thread(this); 
     game.start(); 
    } 

    /** The run() method. I'll be using it as a game loop */ 
    @Override 
    public void run(){ 
     while(true){ 
      repaint(); 
      try { 
       Thread.sleep(30); 
      } catch (InterruptedException ex) { 
       // I don't want to do anything 
      } 
     } 
    } 

    /** I was doing a test draw here, but getting an error */ 
    @Override 
    public void paintComponent(Graphics gr){ 
     Graphics2D g = (Graphics2D) gr; 
     g.setColor(Color.BLACK); 
     g.fillRect(200, 200, 200, 200); 
    } 

} 

экран часто мерцает. Я попытался изменить значение в вызове sleep() в методе запуска, но это не решает проблему.

Как остановить мерцание экрана?

ответ

4

Экран мерцает часто.

Классический признак того, что вы делаете что-то вроде сна на EDT. Это не способ сделать обычную роспись. Используйте Swing Timer для вызова repaint().

См. How to Use Swing Timers & также Performing Custom Painting в руководстве.

+0

Я думаю, что, используя его, вы могли бы сказать, как использовать System.nanoTime() или System.getCurrentTimeMillis() –

+0

(вежливый кашель) - все правильно, конечно, но не лучшее из идей, чтобы повторить неправильный код, IMO :-) – kleopatra

+0

спасибо, чувак, он отлично работал !!!! –

2

Добавить ребенка JPanel, сделавшего рисунок. Это по умолчанию setDoubleBuffered (true), поэтому не мерцает. Сделайте там картину.

Этот намек Эндрю Томпсона о таймере еще более важен.