如何正确添加组件并用组件重新绘制JPanel?

时间:2014-03-12 10:29:21

标签: java jpanel

我想将一个对象添加到JPanel然后在一个时间限制后重新绘制JPanel并添加新对象。

package papProject;

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Animation extends JPanel{

    private static boolean loop = true;
    private static int frameTimeInMillis = 10;

public static void main(String[] args){
        JPanel Ani = new JPanel(); 
        Ani.getParent();
        setup(Ani);

        while (loop) {

                Ani.repaint(); 

                try {
                    Thread.sleep(frameTimeInMillis);
                } catch (InterruptedException e) {
                }
            }
        }

public static void setup(JPanel Panel)
{
        Circle circle[] = new Circle[10];
        JFrame jf = new JFrame();

        jf.setTitle("Falling Shapes Animation");
        Panel.setLayout(new BorderLayout());
        jf.setSize(600,400);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.getContentPane().add(Panel);

        for(int i = 0; i < circle.length; i++ )
        {
            Panel.add(circle[i] = new Circle());
        } 
    }
}

此代码绘制JPanel并向其添加圆形对象,并且应该重新绘制该组件,然后添加新对象。我相信我的问题在于main()方法。

@SuppressWarnings("serial")
public class Circle extends Animation implements ActionListener 
{

    int ranNum = 0;
    int y = 0;
    int x = (int) Math.random();
    int velY = 2; 

    Circle()
    {
        x = getRanNum();
    }

     public int getRanNum() {
       Random rand = new Random(); 
       for (int j = 0; j<10; j++)        
       ranNum = rand.nextInt(300);
       return ranNum;
       } 

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        g.setColor(Color.RED);
        g.fillOval(x, y, 30, 30);

    }

    public void actionPerformed(ActionEvent e)
    {
        if (y>370){

        velY =-velY;

    }
        y = y + velY;
    }

}

此代码从随机x位置绘制Cirlce对象并沿y方向移动它。 感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:0)

看起来你正在调用EDT(事件调度线程)中的所有内容。 如果那时你使用像

这样的东西
 while (loop) {
            Ani.repaint(); 
            try {
                Thread.sleep(frameTimeInMillis);
            } catch (InterruptedException e) {
            }
        }
    }

这实际上会阻止你的线程,而你却什么都没看到。最好为您的动画创建一个新的ThreadRunnable,然后启动新的主题。

答案 1 :(得分:0)

我不确定,但在主方法中,您重新绘制JPanel但不是JFrame,它是显示的窗口。我留下你的代码示例,我重新绘制了JFrame和cirlce移动!

@SuppressWarnings("serial")
public class Animation extends JPanel{

    private static boolean loop = true;
    private static int frameTimeInMillis = 100;
    static JFrame jf;

public static void main(String[] args){
    JPanel Ani = new JPanel(); 
    Ani.getParent();
    setup(Ani);
    jf = new JFrame();

    while (loop) {

        jf.add(new Circle());
        jf.repaint();
        jf.setVisible(true);

            try {
                Thread.sleep(frameTimeInMillis);
            } catch (InterruptedException e) {
            }
        }
    }