Java: добавить 2 анимированных объекта (paintComponent) на один и тот же JPanel

1

У меня есть класс, который создает анимированный объект (червоподобную анимацию), перерисовывая его через таймер. И еще один класс, в котором есть мой кадр и панель. Когда я создаю экземпляры 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 червя внутри той же панели.

Является ли концепция совершенно неправильной? благодаря

Теги:
graphics
swing
jpanel
animation

1 ответ

2
Лучший ответ
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 );
        }
    }
}

Этот класс также будет отвечать за анимацию.

  • 0
    Оно работало завораживающе. Я установил макет в null и установил расположение и размер каждого компонента, они анимируются в одном и том же пространстве. Я буду изучать создание отдельного класса для анимации этих компонентов. Спасибо!!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню