Пауза Графика?

Итак, у меня есть этот графический код JPanel:

public void paint(Graphics g){
    super.paint(g);

    for(int y=0 ;y < 50; y++){
        for(int x = 0; x < 50; x++){
            if(m.getMaze(x, y).equals("g")){
                g.drawImage(m.getGround(), x * 16, y * 16,null);
            }
            if(m.getMaze(x, y).equals("w")){
                g.drawImage(m.getWall(), x * 16, y * 16,null);
            }
            if(m.getMaze(x, y).equals("S")){
                g.drawImage(m.getStart(), x * 16, y * 16,null);
            }
            if(m.getMaze(x, y).equals("E")){
                g.drawImage(m.getEnd(), x * 16, y * 16,null);
            }
        }
    }
}

А внутри цикла for (второй) я хотел бы приостановить его на полсекунды, чтобы вы могли видеть, как он рисует каждую плитку. Дело в том, когда я использую

Thread.sleep(500);

После второго цикла for это просто останавливает все навсегда. Если я использую

g.wait(500);

это продолжает спамить

java.lang.IllegalMonitorStateException

в консоли. И да, это окружено try/catch. Как я могу приостановить это?

2 ответа

1) использовать paintComponent() метод для пользовательских картин intead из paint(), Читайте о пользовательских картинах в Java

2) Не блокируйте EDT с Thread.sleep(500); или же g.wait(500);,

Кажется, вам нужно использовать качели Timer для загрузки. Вот простой пример:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class TestFrame extends JFrame {

    private Timer timer;

    public TestFrame() {
        init();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private void init() {
        final DrawPanel p = new DrawPanel();
        timer = new Timer(500, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if(p.drawingTiles < 16){
                    p.addDrawingTile();
                    p.repaint();
                } else {
                    timer.stop();
                    System.out.println("done");
                }
            }
        });
        timer.start();
        add(p);
    }

    public static void main(String args[]) {
        new TestFrame();
    }

    private class DrawPanel extends JPanel{

        protected int drawingTiles = 0;

        private int tiles[][] = new int[4][4];

        public DrawPanel(){
            Random r = new Random();
            for(int i=0;i<tiles.length;i++){
                for(int j=0;j<tiles.length;j++){
                    tiles[i][j] = r.nextInt(5);
                }
            }
        }

        public void addDrawingTile() {
            drawingTiles++;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            int curTiles = 0;
            for(int i=0;i<tiles.length;i++){
                for(int j=0;j<tiles.length;j++){
                    if(curTiles <drawingTiles){
                        curTiles++;
                        g.drawString(tiles[i][j]+"", (j+1)*10, (i+1)*10);
                    }
                }
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(50,50);
        }

    }
}

На качели таймер вызова repaint(50L, x*16, y*16, 16, 16);, Используйте поля для текущего состояния (x, y),

и на каждом paintComponent рисовать только это состояние / плитка.

Другие вопросы по тегам