【问题标题】:JLabel animation in JPanelJPanel 中的 JLabel 动画
【发布时间】:2010-03-18 02:31:22
【问题描述】:

在摸索之后,我发现最好通过扩展 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;              
            }
        }
    }
}

谢谢!

【问题讨论】:

    标签: java swing animation jlabel java-2d


    【解决方案1】:

    我注意到为了制作动画 屏幕上的 JLabels 我需要 设置布局(空);和 setbounds 的 组件,然后进行动画处理 最终设置位置(x,y);。这是 最佳实践或糟糕的方法 动画组件?

    嗯,这并不完全正确。您可以只使用该位置,标签将在屏幕上移动。但是,如果您曾经调整框架或任何东西的大小,则将调用布局管理器并重新定位标签,并​​且布局管理器定义的位置在 FlowLayout 的情况下将是面板的顶部/左侧。然后动画将从该位置继续。所以实际上,是的,这正是你需要做的。

    我发现它是最简单的动画制作方法,因为 Swing 会自动重新绘制组件的“最后”位置(以恢复背景)以及绘制组件的新位置。这一切都通过一个 setLocation() 方法实现。

    有些人喜欢通过直接在面板上绘制图像来进行自定义绘画,但是您负责清除图像的旧位置,以便重新绘制背景,然后在新位置绘制图像。我觉得这工作量太大了。

    【讨论】:

    • 感谢您的及时回复。正是我需要的:)
    • 我现在遇到了这个问题。当调整 jframe jlable 的大小时,jlable 出现在它的初始位置。有没有办法避免这种情况。我的意思是我想移动 jlable 而不出现在初始位置,即使调整大小?跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    相关资源
    最近更新 更多