Как мне остановить мерцание экрана при рисовании? - PullRequest
2 голосов
/ 11 декабря 2011

Вот мой код:

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() в методе run, но это не решило проблему.

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

Ответы [ 2 ]

4 голосов
/ 11 декабря 2011

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

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

См. Как использовать Swing Timers , а также Выполнение пользовательской рисования в руководстве.

2 голосов
/ 11 декабря 2011

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

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

...