[英]repaint() is not called from run
我有一个Jpanel,在那里我可以玩一些游戏。 我的问题是该方法运行时不会重新绘制图像。 我究竟做错了什么? 如果我在keyLister中调用repaint(),将重新绘制jpanel,但可运行性不重要...
谢谢您的帮助!!!!
public class Board extends JPanel implements Runnable {
private Map map;
private Player player;
public Board(String path) {
this.map = new Map(path);
this.jugador = new Jugador();
addKeyListener(new Al());
this.setFocusable(true);
}
public void paint(Graphics g) {
super.paint(g);
for (int y = 0; y < 23; y++) {
for (int x = 0; x < 37; x++) {
if (map.getLab(x, y).equals("f")) {
g.drawImage(map.getImgFinish(), x * map.getTamImagen(), y * map.getTamImagen(), null);
}
if (map.getLab(x, y).equals("g")) {
g.drawImage(map.getImgGrass(), x * map.getTamImagen(), y * map.getTamImagen(), null);
}
if (map.getLab(x, y).equals("w")) {
g.drawImage(map.getImgWall(), x * map.getTamImagen(), y * map.getTamImagen(), null);
}
}
player.drawPlayer(g, player.getCoorX() * map.getTamImagen(), player.getCoorY() * map.getTamImagen());
}
}
public void run() {
while (true) {
repaint();
}
}
public class Al extends KeyAdapter {
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_LEFT) {
if (!map.getLab(player.getCoorX() - 1, player.getCoorY()).equals("w")) {
player.move(-1, 0);
}
}
if (keyCode == KeyEvent.VK_RIGHT) {
if (!map.getLab(player.getCoorX() + 1, player.getCoorY()).equals("w")) {
player.move(1, 0);
}}}}}
那是一个非常紧密的while循环,冒着占用CPU完全使您的GUI无法使用的风险。 与其在执行过程中循环播放,不如对事件进行响应要好得多。 例如,如果要在按下某个键时更改视图,则在收到已按下该键的通知后,而不是在紧的while循环内,请调用repaint()
。 您可以在执行此操作时使用KeyListener,但是要了解,这些在组件焦点方面非常灵活,因此(最好是其他原因)最好使用Key Bindings 。
如果您出于其他原因需要运行游戏循环,请不要紧缩-没有Thread.sleep或其中没有任何中断。 为了确保Swing线程安全,最好不要使用while循环,而应该使用Swing计时器 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.