【问题标题】:Java swing animate swing components without performance lossJava swing 为 Swing 组件制作动画而不会造成性能损失
【发布时间】: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 方法中。那么,您的性能问题很可能已经消失了。

标签: java swing animation


【解决方案1】:

是的,这是错误的。绝不,绝不,绝不,绝不在绘画方法中读取文件/图像。这种方法必须快得令人眼花缭乱,并且必须只涉及绘画,这样做,读取文件,将不必要地减慢你的 GUI 爬行。为什么要这样做?您可以在构造函数或方法中读取一次图像,然后根据需要多次在paintComponent 中重用图像对象。

顺便说一句,您最好将图像作为资源而不是文件来获取。

【讨论】:

  • 在阅读您的评论时,我真的是在打自己的脸。这太明显了,我不知道为什么我一开始没有看到这一点。我会检查这是否是问题并更新我的帖子!谢谢
  • 是的,它确实有效。非常感谢,再次!你真的帮了我大忙!将查看资源!
  • @user3249696:很高兴它有帮助!
猜你喜欢
  • 1970-01-01
  • 2011-09-21
  • 2012-02-05
  • 2011-02-17
  • 2014-02-10
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多