繁体   English   中英

不从运行中调用repaint()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM