不从run中调用repaint()

时间:2017-08-16 23:16:12

标签: java multithreading swing runnable

我有一个Jpanel,我画了一个级别的游戏。我的问题是该方法不会重绘图像。我究竟做错了什么? 如果我在keyLister中调用repaint(),那么jpanel会被重新绘制,但是runnable没有重要性......

感谢您的帮助!!!!

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

            }}}}}

1 个答案:

答案 0 :(得分:3)

这是一个非常紧张的while循环,一个可能会占用CPU的风险完全导致GUI无用。不要像你正在做的那样循环,而是在事件发生时响应事件要好得多。例如,如果要在按下某个键时更改视图,则在收到按键被通知的通知后调用repaint(),而不是在紧密的while循环中。您可以使用KeyListener进行此操作,但要了解这些在组件焦点方面非常小,为此(以及其他原因)您最好使用Key Bindings

如果由于其他原因需要运行游戏循环,请不要让它太紧 - 如果没有Thread.sleep或其中有任何中断。为了Swing线程安全的利益,你最好不要使用while循环,而是使用Swing Timer代替。