repaint()不是在摆动

时间:2016-02-21 11:10:34

标签: java swing awt

package games;

import java.awt.*;   
import java.awt.event.*;   
import javax.swing.*;    

public class viza extends JPanel implements ActionListener {       

/**   
     *   
     */  
    private static final long serialVersionUID = 1L;      
    int x=0, y=200;
    Timer tm =new Timer(5,this);     
    public viza(){    
        tm.start();    
    }    
    public void paintComponent(Graphics g){    
        g.setColor(Color.red);    
        g.fillRect(x, y, 20, 20);    
    }     
    public void actionPerformed(ActionEvent e){   
        x=x+1;   
        y=y+1;   
        if(x>300)    
           x=0;      
        if(x<0)   
            x=0;        
        repaint();   //after x and y are changet then I use repaint();
    }     // the frame is created and the new object is added into the frame.
    public static void main(String[] args){     
        viza a=new viza();     
        JFrame frame = new JFrame();     
        frame.setSize(500,500);          
        frame.add(a);      
        frame.setVisible(true);         
    }     
}[1]      

代码用于在面板上绘制填充矩形。但是,当我启动程序时,对象会移动,但面板不会重新绘制。如果我在程序运行时尝试调整窗口大小,它会正确加载。一旦我停止这样做,面板或框架(不确定)不再重新粉刷。所以我最终会排成一行。

1 个答案:

答案 0 :(得分:2)

在重新绘制新位置的矩形之前,应清除底层窗格。

为此,让super.paintComponent()为您执行此操作,因为这将是在JComponent中自定义绘制的正确方法:

public void paintComponent(Graphics g){    
    super.paintComponent(g); // let it do the default paint
    g.setColor(Color.red);    
    g.fillRect(x, y, 20, 20);    
}

另外,您可能希望在关闭框架后向框架添加默认关闭操作(在main方法中)以退出程序:

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

另一个提示是为您的计时器设置一个更大的timeout,因为5毫秒发生得非常快,您的用户可能看不到移动。尝试大于50100的内容。

祝你好运。