Pergunta

Depois de coçar, achei que é melhor implementar um componente de imagem personalizado, estendendo um jlabel. Até agora, isso funcionou muito bem, pois posso adicionar várias "imagens" (Jlabels sem a quebra do layout. Só tenho uma pergunta que espero que alguém possa responder por mim.

  • Percebi isso para animar jlabels na tela, preciso setlayout(null); e setbounds do componente e depois para animar eventualmente setlocation(x,y);. Esta é uma prática recomendada ou uma maneira terrível de animar um componente? Eu pretendo eventualmente fazer uma aula de animação, mas não quero fazê -lo e acabar tendo que jogar.

Incluí código relevante para uma verificação rápida de revisão.

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;

public class GraphicsPanel extends JPanel  {
    private Timer timer;
    private long startTime = 0;
    private int numFrames = 0;
    private float fps = 0.0f;
    private int x = 0;

    GraphicsPanel() {
        final Entity ent1 = new Entity();
        ent1.setBounds(x, 0, ent1.getWidth(), ent1.getHeight());
        add(ent1);

        //ESSENTIAL
        setLayout(null);

        //GAMELOOP
        timer = new Timer(30, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                getFPS();
                incX();
                ent1.setLocation(x, 0);
                repaint();
            }
        });
        timer.start();
    }

    public void incX() { x++; }

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setClip(0, 0, getWidth(), getHeight());

        g2.setColor(Color.BLACK);
        g2.drawString("FPS: " + fps, 1, 15);
    }

    public void getFPS()
    {
        ++numFrames;
        if (startTime == 0) {
            startTime = System.currentTimeMillis();
        } else {
            long currentTime = System.currentTimeMillis();
            long delta = (currentTime - startTime);
            if (delta > 1000) {
                fps = (numFrames * 1000) / delta;
                numFrames = 0;
                startTime = currentTime;              
            }
        }
    }
}

Obrigada!

Foi útil?

Solução

Percebi que, para animar os jabels na tela, preciso definir (nulo); e setbounds do componente e, em seguida, para animar, eventualmente setLocation (x, y);. Esta é uma prática recomendada ou uma maneira terrível de animar um componente?

Bem, isso não é totalmente verdadeiro. Você pode simplesmente brincar com o local e a etiqueta se moverá pela tela. No entanto, se você redimensionar o quadro ou qualquer coisa, o gerenciador de layout será invocado e o rótulo será reposicionado e o local definido pelo gerente de layout que, no caso de um fluxo de fluxo, será a parte superior/esquerda do painel. A animação continuará a partir desse local. Então, na realidade, sim, é exatamente isso que você precisa fazer.

Acho a maneira mais fácil de fazer a animação, pois o Swing repintará automaticamente o local "último" do componente (para restaurar o plano de fundo) e pintar o novo local do componente. Tudo isso é alcançado por um único método setLocation ().

Algumas pessoas gostam de fazer pintura personalizada desenhando a imagem diretamente no painel, mas você é responsável por limpar o local antigo da imagem para que o fundo seja redesenhado e depois desenhe a imagem no novo local. Acho isso muito trabalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top