Java swing 在没有性能损失的情况下动画摆动组件

Java swing animate swing components without performance loss

解法:

是的,这是错误的。从不,从不,从不,从不在绘画方法中读入 files/images。这种方法必须非常快,并且必须只涉及绘画,这样做,读取文件,会不必要地减慢你的 GUI 速度。为什么要这样做?您可以在构造函数或方法中一次读取图像,然后根据需要多次在 paintComponent 中重用图像对象。

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

谢谢,装满鳗鱼的气垫船


我正在创建一个非常简单的 'Fruit Ninja' 版本。一些水果飞到屏幕上,用户必须将其切成两半的游戏。

我正在为水果使用带有 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();
}

是的,这是错误的。 Never, never, never, NEVER 读入files/images 一个绘画方法。这种方法必须非常快,并且必须只涉及绘画,这样做,读取文件,会不必要地减慢你的 GUI 速度。为什么要这样做?您可以在构造函数或方法中一次读取图像,然后根据需要多次在 paintComponent 中重用图像对象。

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