簡體   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