【发布时间】:2015-01-19 00:07:51
【问题描述】:
解决方案:
是的,这是错误的。永远,永远,永远,永远不要在绘画方法中读取文件/图像。这种方法必须快得令人眼花缭乱,并且必须只涉及绘画,这样做,读取文件,将不必要地减慢你的 GUI 爬行。为什么要这样做?您可以在构造函数或方法中读取一次图像,然后根据需要多次在paintComponent 中重用图像对象。
顺便说一句,您最好将图像作为资源而不是文件来获取。
谢谢,满载鳗鱼的气垫船
我正在创建一个非常简单的“水果忍者”版本。一个游戏,一些水果飞到屏幕上,用户必须把它切成两半。
我正在使用带有 ImageIcon 的 JLabel 作为水果。我使用摇摆计时器进行移动。
效果很好,也有动画,但这是棘手的部分。当我添加背景图像时,动画非常滞后。
问题是:如何添加背景图片,而挥杆动画不会失去性能?
我在下面添加了一些代码。
提姆
我在其中绘制背景图像的 JPanel:
public class PlayingField extends javax.swing.JPanel {
public PlayingField()
{
this.setBounds(0, 50, 500, 500);
this.setLayout(null);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
BufferedImage img = null;
try {
img = ImageIO.read(new File(System.getProperty("user.dir")+"/assets/background.png"));
} catch (IOException e)
{
}
g.drawImage(img, 0, 0, null);
}
}
我在上面绘制的对象只是带有 ImageIcons 的简单 JLabel。
我有一个处理动画的计时器:
public class GameTimer extends javax.swing.Timer implements ActionListener {
GameController gameController;
public GameTimer(GameController gameController) {
super(delay, null);
this.addActionListener(this);
this.gameController = gameController;
}
@Override
public void actionPerformed(ActionEvent e)
{
gameController.moveObject();
}
}
最后但并非最不重要的是移动对象的代码:
public void moveObject()
{
activeObject.setPositionY((activeObjectView.getPositionY()+1));
playingField.repaint();
}
【问题讨论】:
-
欢迎查看代码,尤其是添加背景图像的方式。我担心你可能会在 paint 或 paintComponent 或类似的东西中将图像读入你的程序中。此类问题几乎总是需要代码,最好是创建并发布您的minimal code example program。
-
是的,我确实在 paintComponent 覆盖中做到了。那是错的吗?你能指出我正确的方向吗?我添加了一些代码!谢谢!
-
不要在
paintComponent方法中加载图像!!!1111 在构造函数中加载它一次,并且只绘制它在paintComponent方法中。那么,您的性能问题很可能已经消失了。