Java JPanel中的JLabel动画
经过反复研究,我发现最好通过扩展JLabel来实现自定义映像组件。到目前为止,这非常有效,因为我可以添加多个“图像”(jlabel),而不会破坏布局。我只是有一个问题,希望有人能回答我Java JPanel中的JLabel动画,java,swing,animation,jlabel,java-2d,Java,Swing,Animation,Jlabel,Java 2d,经过反复研究,我发现最好通过扩展JLabel来实现自定义映像组件。到目前为止,这非常有效,因为我可以添加多个“图像”(jlabel),而不会破坏布局。我只是有一个问题,希望有人能回答我 我注意到,为了在屏幕上设置JLabel的动画,我需要设置组件的setlayout(null);和setbounds,然后最终设置setlocation(x,y)的动画这是制作组件动画的最佳实践还是糟糕的方法?我计划最终制作一个动画类,但我不想这样做,最终不得不放弃它 我已经包括了相关的代码,以便快速检查 im
- 我注意到,为了在屏幕上设置JLabel的动画,我需要设置组件的
和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在屏幕上显示我需要
setlayout(null);以及
组件,然后设置动画
最终设置位置(x,y);。是这样吗
最佳实践还是糟糕的解决方法
为组件设置动画
嗯,这并不完全正确。您可以只玩位置,标签将在屏幕上移动。但是,如果您调整框架大小或任何内容,则将调用布局管理器,标签将被重新定位,并且布局管理器定义的位置在FlowLayout的情况下将位于页面的顶部/左侧动画将从那个位置继续。所以在现实中,是的,这正是你需要做的
我发现这是制作动画最简单的方法,因为Swing会自动重新绘制组件的“最后”位置(以恢复背景)以及绘制组件的新位置。这一切都是通过一个setLocation()方法实现的
有些人喜欢通过直接在面板上绘制图像来进行自定义绘制,但是你要负责清除图像的旧位置,以便重新绘制背景,然后在新位置绘制图像。我觉得这项工作太多了
我注意到为了使动画化
JLabels在屏幕上显示我需要
setlayout(null);以及
组件,然后设置动画
最终设置位置(x,y);。是这样吗
最佳实践还是糟糕的解决方法
为组件设置动画
嗯,这并不完全正确。您可以只玩位置,标签将在屏幕上移动。但是,如果您调整框架大小或任何内容,则将调用布局管理器,标签将被重新定位,并且布局管理器定义的位置在FlowLayout的情况下将位于页面的顶部/左侧动画将从那个位置继续。所以在现实中,是的,这正是你需要做的
我发现这是制作动画最简单的方法,因为Swing会自动重新绘制组件的“最后”位置(以恢复背景)以及绘制组件的新位置。这一切都是通过一个setLocation()方法实现的
有些人喜欢通过直接在面板上绘制图像来进行自定义绘制,但是您需要负责清除图像的旧位置,以便重新绘制背景,然后在新位置绘制图像。我觉得这项工作太多了。感谢您的及时回复。正是我所需要的:)我现在有这个问题。当调整jframe jlable的大小显示在其初始位置时。是否有任何方法可以避免这种情况。我的意思是,即使在调整大小时,我也希望移动jlable而不显示在初始位置?感谢您的及时回复。正是我所需要的:)我现在有这个问题。当调整jframe jlable的大小时,它会显示在初始位置。有没有办法避免这种情况。我的意思是,即使在调整大小时,我也希望移动jlable而不显示在初始位置?