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 中重用图像对象。
顺便说一句,您最好将图像作为资源而不是文件来获取。
解法:
是的,这是错误的。从不,从不,从不,从不在绘画方法中读入 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 中重用图像对象。
顺便说一句,您最好将图像作为资源而不是文件来获取。