【问题标题】:repaint() is not called from runrepaint() 不是从运行中调用的
【发布时间】:2017-08-16 23:16:12
【问题描述】:

我有一个 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);

            }}}}}

【问题讨论】:

    标签: java multithreading swing runnable


    【解决方案1】:

    这是一个非常紧凑的 while 循环,它可能会完全占用 CPU,从而使您的 GUI 毫无用处。与其像你正在做的那样循环,你最好在事件发生时响应它们。例如,如果您想在按下某个键时更改视图,则在收到该键已被按下的通知后调用repaint(),而不是在紧密的 while 循环中。您可以像这样做一样使用 KeyListener,但要了解这些对于组件焦点非常烦躁,因此(和其他原因)您最好使用 Key Bindings

    如果您出于其他原因需要运行游戏循环,请不要把它弄得太紧——没有 Thread.sleep 或其中的任何中断。为了 Swing 线程的安全,最好不要使用 while 循环,而是使用 Swing Timer

    【讨论】:

    • keyListener 中重绘方法的调用是否正确?
    • @J.Doe:是的,这样做很好。我很好奇,在您上面的代码中,您在哪里创建调用run() 方法的线程?
    • 在 addNotify() 中被调用。我删除了可以发布
    • @HovercraftFullOfEels 你能帮我解决这个问题吗:Arial Unicode MS is not aligning in JTree
    猜你喜欢
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多