Пауза Графика?
Итак, у меня есть этот графический код 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 рисовать только это состояние / плитка.