JPanel 中的 JLabel 动画
题
经过摸索之后,我发现最好通过扩展 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;
}
}
}
}
谢谢你!
解决方案
我注意到,为了在屏幕上进行jlabels的动画,我需要设置layout(null);和组件的设定圈,然后为动画制作最终的setLocation(x,y);。这是使组件动画动画的最佳实践还是可怕的方法?
嗯,这并不完全正确。您只需调整该位置,标签就会在屏幕上移动。但是,如果您调整框架或任何其他内容的大小,则将调用布局管理器,并且将重新定位标签,并且布局管理器定义的位置在 FlowLayout 的情况下将是面板的顶部/左侧。然后动画将从该位置继续。所以实际上,是的,这正是您需要做的。
我发现这是制作动画的最简单方法,因为 Swing 会自动重新绘制组件的“最后”位置(以恢复背景)以及绘制组件的新位置。这一切都是通过一个 setLocation() 方法来实现的。
有些人喜欢通过直接在面板上绘制图像来进行自定义绘画,但是您需要负责清除图像的旧位置,以便重新绘制背景,然后在新位置绘制图像。我觉得这工作量太大了。
不隶属于 StackOverflow