JPanel中的JLabel动画

在刮擦后我发现最好通过扩展JLabel来实现自定义图像组件。 到目前为止,这已经很有效,因为我可以添加多个“图像”(jlabels没有布局中断。我只是有一个问题,我希望有人可以为我回答。

  • 我注意到为了在屏幕上为setlayout(null);制作动画,我需要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); 和组件的setbounds,然后动画最终setlocation(x,y);. 这是动画组件的最佳实践还是可怕的方法?

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

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

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