#java #swing #runtime-error #illegalmonitorstateexcep
#java #качать #время выполнения-ошибка #illegalmonitorstateexcep
Вопрос:
Итак, у меня есть этот графический код 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 . Как я могу приостановить это?
Комментарии:
1. Еще раз та же ошибка. Не блокируйте EventDispathThread всеми режимами ожидания. Вместо этого используйте javax.swing. Таймер. при выполнении действия выполняется вызов repaint(). Также не переопределяйте paint(), а вместо этого paintComponent()
2.Также
g.drawImage(m.getEnd(), x * 16, y * 16,null);
было бы лучше,g.drawImage(m.getEnd(), x * 16, y * 16,this);
поскольку каждыйJComponent
являетсяImageObserver
.
Ответ №1:
При вызове таймера swing repaint(50L, x*16, y*16, 16, 16);
. Использовать поля для текущего состояния ( x
, y
),
и на каждом paintComponent рисуйте только это состояние / плитку.
Ответ №2:
1) используйте paintComponent()
метод для пользовательских изображений вместо paint()
. Читайте о пользовательских картинах в Java
2) Не блокируйте EDT
с помощью Thread.sleep(500);
или g.wait(500);
.
Кажется, вам нужно использовать swing 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);
}
}
}