JLabel анимация в JPanel - PullRequest
1 голос
/ 18 марта 2010

Поработав, я обнаружил, что лучше всего реализовать пользовательский компонент изображения, расширяя JLabel. До сих пор это работало замечательно, так как я могу добавить несколько «изображений» (jlabels без разрыва макета. У меня просто есть вопрос, на который, я надеюсь, кто-нибудь ответит за меня.

  • Я заметил, что для анимации JLabels по экрану мне нужно setlayout(null); и setbounds компонента, а затем, в конце концов, анимировать setlocation(x,y);. Это лучшая практика или ужасный способ оживить компонент? Я планирую в конце концов сделать урок анимации, но я не хочу этого делать, и в итоге мне придется его бросить.

Я включил соответствующий код для быстрой проверки.

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

Спасибо!

1 Ответ

4 голосов
/ 18 марта 2010

Я заметил, что для того, чтобы оживить JLabels через экран мне нужно setlayout (нуль); и установление границ компонент, а затем оживить в конечном итоге setlocation (x, y) ;. Это лучшая практика или ужасный способ Анимировать компонент?

Ну, это не совсем так. Вы можете просто поиграть с локацией и метка будет перемещаться по экрану. Однако, если вы когда-либо измените размер фрейма или чего-либо еще, то будет вызван менеджер макета, и метка будет переставлена, а местоположение определено менеджером макета, который в случае FlowLayout будет верхним / левым на панели. Анимация будет продолжена с этого места. Так что на самом деле, да, это именно то, что вам нужно сделать.

Я считаю, что это самый простой способ сделать анимацию, поскольку Swing автоматически перекрасит «последнее» местоположение компонента (для восстановления фона), а также закрасит новое местоположение компонента. Все это достигается одним методом setLocation ().

Некоторым людям нравится рисовать на заказ, рисуя изображение прямо на панели, но тогда вы отвечаете за очистку старого местоположения изображения, чтобы фон перерисовывался, а затем рисовали изображение в новом месте. Я считаю, что это слишком много работы.

...