我正在制作一个游戏/模拟器,并使用以下方法将图像加载到我当前的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()看起来没有效果?非常感谢您的转发
1条答案
按热度按时间qzwqbdag1#
但是仅仅调用这个rotateeast()并不能立即更新图片,它只会在我的常规observer update()循环调用repaint()之后更新,
不知道这是否会产生影响,但正常的逻辑是:
即使在这种情况下没有区别,在动态更改组件的属性(包括从面板添加/删除组件)时,也应该始终使用此顺序。