【问题标题】:Java: Add 2 animated objects (paintComponent) on the same JPanelJava:在同一个 JPanel 上添加 2 个动画对象(paintComponent)
【发布时间】:2015-04-01 15:51:14
【问题描述】:

我有一个类,它通过计时器重新绘制动画对象(蠕虫状动画)。 另一个类有我的框架和面板。 当我创建该对象的 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);
        }
    }

然后我在这里创建新的 Movimento 对象

public class GeraImg{
    JFrame frame = new JFrame("Gera Imagem");
    JPanel panel = new JPanel();

    Movimento mov = new Movimento(1000,400);
    Movimento mov2 = new Movimento(100,400);

    public GeraImg(){
        fazerFrame();   
    }

    public void fazerFrame(){

        panel.setOpaque(true);
        panel.setBackground(new Color(150,200,20,255));
        panel.add(mov2);
        panel.add(mov);

        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.pack();
        frame.setVisible(true);
    }
    public static void main(String[] args){
        new GeraImg();      
    }
}

然后我并排得到 2 个单独的动画面板,而不是同一个面板内的 2 个蠕虫。

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

【问题讨论】:

    标签: java swing animation graphics jpanel


    【解决方案1】:
    panel.add(mov2);
    panel.add(mov);
    

    默认情况下,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);
            }
        }
    }
    

    然后您将创建组件来绘制所有 Movimento 对象。比如:

    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 );
            }
        }
    }
    

    这个类也将负责动画。

    【讨论】:

    • 它就像一个魅力。我将布局设置为 null 并设置每个组件的位置和大小,它们在同一空间中进行动画处理。我将研究创建一个单独的类来为这些组件设置动画。谢谢!!
    猜你喜欢
    • 2023-04-03
    • 2017-03-10
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多