Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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:在同一JPanel上添加2个动画对象(paintComponent)_Java_Swing_Animation_Graphics_Jpanel - Fatal编程技术网

Java:在同一JPanel上添加2个动画对象(paintComponent)

Java:在同一JPanel上添加2个动画对象(paintComponent),java,swing,animation,graphics,jpanel,Java,Swing,Animation,Graphics,Jpanel,我有一个类,它通过计时器重新绘制动画对象(类似蠕虫的动画)来创建动画对象。 另一个类有我的框架和面板。 当我创建该对象的2个(mov和mov2)实例并将其添加到面板中时,它们会出现在单独的面板中(或类似于)。这是密码 public class Movimento extends JComponent{ int t; int a; int[][] matriz; public Movimento(int tamanho, int area){

我有一个类,它通过计时器重新绘制动画对象(类似蠕虫的动画)来创建动画对象。 另一个类有我的框架和面板。 当我创建该对象的2个(mov和mov2)实例并将其添加到面板中时,它们会出现在单独的面板中(或类似于)。这是密码

public class Movimento extends JComponent{
    int t;  
    int a;  
    int[][] matriz;

    public Movimento(int tamanho, int area){        
        t = tamanho;
        a = area;

        gerarMatriz();
        gerarPanel();

        ActionListener counter = new ActionListener() {
            public void actionPerformed(ActionEvent ev){
                movimentarMatriz();
                repaint();
            }
        };          
        new Timer(1, counter).start();
    }

    public void gerarPanel(){
        this.setPreferredSize(new Dimension(a, a));
    }   

    public void gerarMatriz(){
       /*
        *Generates an array[][] with initial coordinates
        */
    }

    public void movimentarMatriz(){
       /*
        * add a new coordinate to the last space of the array  
        */
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        for(int i = 0; i < matriz.length; i++){
            g.drawRect(matriz[i][0],matriz[i][1],1,1);
        }
    }
然后我得到两个并排分开的动画面板,而不是同一面板内的两个蠕虫

这个概念完全错了吗? 谢谢

默认情况下,JPanel使用FlowLayout,因此是的,您的两个组件区域并排添加

您可以尝试使用:

panel.setLayout(null);
panel.add(mov2);
panel.add(mov);
这将允许在面板内随机放置组件。但现在您负责在组件上使用setSize(…)和setLocation(…),以便可以在面板中正确绘制组件

但是,更好的方法是创建自己的类来实现自己的绘制方法。比如:

public class Movimento()
{
    ...

    public void paintMe(Graphics g)
    {
        for(int i = 0; i < matriz.length; i++)
        {
            g.drawRect(matriz[i][0],matriz[i][1],1,1);
        }
    }
}
public class MovimentoAnimator extends JPanel
{
    private List<Movimento> movimentos = new ArrayList<Movimento>();

    public void addMovimento(Movimento movimento)
    {
        movimentos.add( movimento );
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        for (Movimento movimento: movimentos
        {
            movimento.paintMe( g );
        }
    }
}
公共类Movimento()
{
...
公共空间绘画(图形g)
{
对于(int i=0;i
然后创建组件以绘制所有Movimento对象。比如:

public class Movimento()
{
    ...

    public void paintMe(Graphics g)
    {
        for(int i = 0; i < matriz.length; i++)
        {
            g.drawRect(matriz[i][0],matriz[i][1],1,1);
        }
    }
}
public class MovimentoAnimator extends JPanel
{
    private List<Movimento> movimentos = new ArrayList<Movimento>();

    public void addMovimento(Movimento movimento)
    {
        movimentos.add( movimento );
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        for (Movimento movimento: movimentos
        {
            movimento.paintMe( g );
        }
    }
}
public类MovimentoAnimator扩展了JPanel
{
private List movimentos=new ArrayList();
公共无效添加Movimento(Movimento Movimento)
{
添加(movimento);
}
@凌驾
受保护组件(图形g)
{
超级组件(g);
对于(Movimento Movimento:movimentos
{
绘画运动(g);
}
}
}

这个类还将负责动画。

它工作得很好。我将布局设置为null,并设置每个组件的位置和大小,它们在相同的空间中进行动画。我将考虑创建一个单独的类来为这些组件制作动画。谢谢!!