我需要在程序运行时不断地在不同位置重绘某个图像。所以我设置了一个应该在屏幕上移动图像的while循环,但它只是一遍又一遍地重绘图像。我究竟做错了什么?有没有办法在将旧图像绘制到新位置之前将其删除?
JFrame frame = buildFrame();
final BufferedImage image = ImageIO.read(new File("BeachRoad_double_size.png"));
JPanel pane = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int num = 0;
boolean fluff = true;
while (fluff == true) {
num = num + 1;
g.drawImage(image, num, 0, null);
if (num == 105) {
fluff = false;
}
}
}
};
frame.add(pane);
答案 0 :(得分:3)
您无法在paintComponent()方法中编写循环代码。代码将执行得如此之快,以至于图像只会在最终位置绘制,在您的情况下,x位置应为105.
相反,您需要使用Swing Timer每100毫秒左右安排一次动画。然后当计时器触发时,您更新x位置并调用面板上的repaint()。有关详细信息,请阅读Using Swing Timers上的Swing教程。
答案 1 :(得分:2)
在paintComponent
方法中放置while循环不是这样做的。相反,应该有一些如下设置:
...
final int num = 0;
final JPanel pane;
Timer timer = new Timer(10, new ActionListener() {
public void actionPerformed(ActionEvent e) {
num++;
pane.repaint();
}
});
pane = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, num, 0, null);
}
});
timer.start();
这会将图像移动10毫秒,如Timer构造函数中所指定的那样。
答案 2 :(得分:0)
这是人们开始动画时常见的问题,正如我所做的那样。您无法从屏幕上“删除图像”。但是,您可以重新绘制整个屏幕,然后在新位置重新绘制图像。
在伪代码中:
while (condition)
background(white); //or whatever color your background is
drawImage(x,y);
上面的代码会清除屏幕,因此您可以安全地重绘图像。这有效地“删除”了您的图像。
编辑:我没有阅读您的代码,我刚刚解决了您的问题。所以修复代码的其他答案可能比我的好。