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