0

所以我有这个 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 包围。我怎样才能暂停这个?

4

2 回答 2

2

在摇摆定时器呼叫repaint(50L, x*16, y*16, 16, 16);。使用当前状态的字段 ( x, y),

并且在每个paintComponent 上仅绘制该状态/图块。

于 2014-06-30T09:29:07.850 回答
2

1)paintComponent()定制绘画的使用方法,而不是paint()。阅读Java 中的自定义绘画

2) 不要EDTThread.sleep(500);or阻塞g.wait(500);

似乎您需要使用 swingTimer进行加载。这是一个简单的例子:

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

    }
}
于 2014-06-30T09:41:33.633 回答