您是否尝试过在paintComponent方法中调用super.paintComponent(g)?这将清除您的JPanel中绘制的先前图像:
public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D gui = (Graphics2D) g; Rectangle2D rectangle = new Rectangle2D.Double(x,y,100,150); gui.setPaint(Color.GREEN); gui.fill(rectangle); //time.start();}另外,不要启动计时器或在paintComponent方法内执行任何程序逻辑。首先,您不能完全控制何时或是否将调用该方法,其次,此方法必须仅与绘画有关,而与其他无关,并且需要尽可能快。
例如:
import java.awt.*;import java.awt.event.*;import java.awt.geom.*;import javax.swing.*;public class Graphics2DTest extends JPanel implements ActionListener { private Timer time = new Timer(5, (ActionListener) this); int x = 0, y = 0; public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D gui = (Graphics2D) g; Rectangle2D rectangle = new Rectangle2D.Double(x, y, 100, 150); gui.setPaint(Color.GREEN); gui.fill(rectangle); //time.start(); } public void actionPerformed(ActionEvent arg0) { x++; y++; repaint(); } public Graphics2DTest() { setPreferredSize(new Dimension(700, 500)); time.start(); } private static void createAndShowUI() { Jframe frame = new Jframe("Graphics2DTest"); frame.getContentPane().add(new Graphics2DTest()); frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { createAndShowUI(); } }); }}


