这个我正在制作动画的正方形背后留下了一条痕迹,任何人都可以找出原因吗?

感谢您查看此问题。 我想我只是在挫折中刮伤了我的头骨。 所以我得到的是一个包含’JPanel’的’JFrame’。 ‘JPanel’包含一个小的彩色方块,每当我点击窗口时它应该移动X像素。

好吧,基本上一切都表现得应有,但有一个例外。 当蓝色方块向右移动时,它会在其后面留下其他方块的痕迹。 但是,当我重新调整窗口大小时,小道就会消失。

Catalyst.java

package Prototype; import java.awt.*; public class Catalyst { public static void main(String[] args){ World theWorldInstance = new World("Prototype", 100,100, 600,100); /*title,xpos,ypos,width,height*/ } } 

World.java

 package Prototype; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class World extends JFrame { Level mainPanel; public World(String title, int x, int y, int width, int height) { setTitle(title); setBounds(x,y,width,height); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setBackground(new Color(0x00000000)); initLevel(); } public void initLevel(){ mainPanel = new Level(); Container visibleArea = getContentPane(); visibleArea.add(mainPanel); setVisible(true); add(mainPanel); } } 

Level.java

 package Prototype; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Level extends JPanel implements MouseListener, ActionListener { Square x; public Level() { System.out.println("This is working correctly[JPANEL Cons]"); addMouseListener(this); x = new Square(); } public void paintComponent(Graphics g){ x.draw(g); } public void actionPerformed(ActionEvent e){ } public void mousePressed(MouseEvent e){ requestFocus(); x.move(); repaint(); System.out.println("Focus Acquired"); } public void mouseClicked(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} } 

Square.java

 package Prototype; import java.awt.*; public class Square { private Point position; private int size; private final int displacement; public Square(){ position = new Point(10,10); size = 20; displacement = 5; } public void draw(Graphics g){ g.setColor(Color.blue); g.fillRect(position.x-(size/2), position.y-(size/2), size,size ); g.setColor(Color.black); g.drawRect(position.x-(size/2), position.y-(size/2), size,size ); } public void move() { position.x += displacement; } } 

这些都是我的档案。 我希望我已经正确地措辞了一切,并提供了所需的所有内容。 每当我在过去做过类似的事情时,这种情况从未发生过。 我想我错过了一些小事,或者我做了一些愚蠢的事情。 如果你能帮助我,请提前感谢!

还有另一种方法。 您只需调用父对象的paintComponent方法即可清除该面板。

将其添加到Level中的构造函数中:

 this.setBackground(Color.BLACK); 

这是paintComponent中的第一个调用:

 super.paintComponent(g); 

您可以使用g.clearRect(x,y,width,height) ,并提供所需的坐标,以便清除绘画。 或者你可以给出你正在绘制的整个JPanel/JComponent的尺寸,虽然这样做会记住一件事,所说的绘图不是繁重的工作,否则太多的清洁会给绘画调用增加额外的负担。