我的方法是在循环中使用'reprint()'成功移动图像,这意味着更新其位置而不重叠但现在我想看到图像移动,我使用'thread.sleep()'来给出repaint()之间的时间差距,但它似乎无法正常工作
import java.awt.*;
import javax.swing.*;
public class jp extends JPanel implements ActionListener{
Timer t;
JPanel jl=new JPanel();
int x,y;
jp(){
x=10;
//y=10;
t=new Timer(5,this);
t.start();
}
public void actionPerformed(ActionEvent e){
x++;
y++;
if(x>500){
x=0;
y=0;
}
repaint();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
this.setBackground(Color.black);
g.setColor(Color.blue);
g.fillRect(x,20,50,50);
}
}
public class Jpanel extends JFrame{
public static void main(String[] args) {
jp p=new jp();
JFrame j=new JFrame("TEST_CASE-1");
j.add(p);
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
j.setSize(700,500);
j.setVisible(true);
}
}
答案 0 :(得分:0)
如果您希望通过paintComponent()
中的多个绘图获得动画,例如使用像您所做的那样的for循环,那么您将会感到失望。
它只会执行所有绘图并一次性显示 。无需同时绘制200个矩形,您只需要绘制1个矩形并更新其位置。
要执行动画,如果您打算执行更复杂的操作,则需要计时器(您可以尝试javax.swing.timer
)或循环。您可以在更新矩形的位置时实现无限循环并在循环中执行渲染。
最终,无论采用哪种方法。您需要存储矩形的位置。以如下方式更新并呈现它:
update position
render
update position
render
update position
render
而非
update position
update position
update position
render
render
render
带计时器的动画示例: Repainting/refreshing the JFrame
使用循环制作动画示例:
while(running){
update(); //update position of your rect
repaint(); //redraw your rect (and all other stuff)
}