主要课程:
public Main() {
Frame f = new Frame();
final Panel p = f.p;
final Player player = new Player();
Timer t = new Timer(UPDATE_PERIOD, new ActionListener() {
public void actionPerformed(ActionEvent e) {
Graphics g = p.getGraphics();
p.render(g);
player.tick();
player.render(g);
g.dispose();
}
});
t.start();
}
玩家渲染方法:
public void render(Graphics g) {
g.drawImage(Images.get("player"), x, y, null);
}
问题是,之前绘制的所有图像仍然存在。示例(当我更改绘制图像的x或y时):
答案 0 :(得分:2)
您应该在paintComponent方法中完成所有绘画,而不是自定义渲染您的计时器。类似的东西:
public void actionPerformed(ActionEvent e) {
player.tick();
p.repaint();
}
然后在paintComponent()
中重新渲染播放器和背景当您调整面板大小等时,您当前的绘画会遇到问题
答案 1 :(得分:2)
要绘制Swing
,您不应直接从JPanel获取Graphics
对象。相反,覆盖paintComponent
方法并使用参数Graphics对象来执行自定义绘图,调用父方法来擦除上一个绘图
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
//custom painting goes here
}
如果您想触发重绘,请在JPanel上使用该名称的方法:
p.repaint();
答案 2 :(得分:0)
更改了Graphic的位置后,尝试在ActionListener中调用'p.repaint()'。