Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重复矩形而不是移动动画_Java_Swing_Paintcomponent - Fatal编程技术网

Java 重复矩形而不是移动动画

Java 重复矩形而不是移动动画,java,swing,paintcomponent,Java,Swing,Paintcomponent,这是我的密码 package softwarea1; import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; /* * To change this

这是我的密码

package softwarea1;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Leo
 */
//534
public class Simulation extends JPanel implements ActionListener
{
    DataModels dm;
    Timer tm = new Timer(20, this);
    private int velX = 2;
    private int a = 0; 

    public void create()
    {

        Simulation sm = new Simulation(dm);
        JFrame simulation = new JFrame();
        simulation.setTitle("Traffic light and Car park Siumulation");
        simulation.setSize(600,600);
        simulation.setResizable(false);
        simulation.setVisible(true);
        simulation.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        simulation.add(sm);
    }
    public void paintComponent(Graphics g)
    {



        // Moving Rectangle
        g.setColor(Color.RED);
        g.fillRect(a ,300, 1 ,30);
        tm.start();
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        a += velX;
        repaint();
    }


}
这里的主要课程:

 public class StartProj {
        public static void main(String[] args) {
            DataModels dm = new DataModels();
            Simulation sm = new Simulation(dm);
            sm.create();

        }
    }
我尝试在帧中设置矩形的动画,但它会重复多个矩形。 怎么了?帮助我? 我还有几节课,但没必要。非常感谢

您的方法需要在第一行调用super的方法:

public void paintComponent(Graphics g)
{
    super.paintComponent(g); // **** add this
    // Moving Rectangle
    g.setColor(Color.RED);
    g.fillRect(a ,300, 1 ,30);
    // tm.start(); // **** get rid of this.
}
这一点很重要,因为super方法会重新绘制组件的背景,这是删除旧矩形所必需的


另外,在这个方法内部有程序逻辑,从内部启动一个Swing定时器,这是不应该做的事情。相反,找一个更好、更可控的地方来启动计时器。

一定要尊重这个属性。@caolinhtrung:如果您在调用
pack()/setVisible(…)之前,先覆盖,而不是在
JFrame
上设置大小,并将其作为您的习惯,在
JFrame
上添加组件,这将是明智的做法
。请尊重封装原则,当重写
paintComponent(…)
时,它是
受保护的void
而不是
公共void
这些都是良好的编程实践:-)