image

fcy6dtqo  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(309)

我正在制作一个游戏/模拟器,并使用以下方法将图像加载到我当前的java项目中:

public static Image getImage(String name) {
    URL url = ImageLoader.class.getClassLoader().getResource("resources/" + name);
    Image img = Toolkit.getDefaultToolkit().createImage(url);
    ImageLoader.tracker.addImage(img, 1);
    try {
        ImageLoader.tracker.waitForID(1);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return img;
}

这会将图像加载到我的类中,该类正在绘制所有项目,包括玩家(他可以面对的每个方向有4个不同的图像:北、南、东、西):

private Image player = ImageLoader.getImage("playerEast.png");
private Image playerEast = ImageLoader.getImage("playerEast.png");
private Image playerWest = ImageLoader.getImage("playerWest.png");
private Image playerSouth = ImageLoader.getImage("playerSouth.png");
private Image playerNorth = ImageLoader.getImage("playerNorth.png");

加载上述图像的类在区域中绘制它们,如下所示:

public class TerritoryPanel extends JPanel implements Observer {
@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g);
//Draw player
    g.drawImage(player, (x, y, this);

}
我正在尝试在同一类中使用此方法更新pics:

public void rotateEast(){
    player = playerEast;
    repaint();
    revalidate();
}

..但是仅仅调用这个rotateeast()并不能立即更新图片,它只会在我的常规observer update()循环调用repain()时更新,这种情况每秒钟都会发生一次,因此rotateeast丢失的重绘是可见的:

@Override
public void update(Observable o, Object arg) {
    if (EventQueue.isDispatchThread()) {
        this.repaint();
    } else { // Simulation-Thread
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                repaint();
            }
        });
    }
}

为什么rotateeast的repaint()看起来没有效果?非常感谢您的转发

qzwqbdag

qzwqbdag1#

但是仅仅调用这个rotateeast()并不能立即更新图片,它只会在我的常规observer update()循环调用repaint()之后更新,
不知道这是否会产生影响,但正常的逻辑是:

revalidate(); // to invoke the layout manager
repaint(); // to repaint all the components

即使在这种情况下没有区别,在动态更改组件的属性(包括从面板添加/删除组件)时,也应该始终使用此顺序。

相关问题