use*_*962 2 java swing bufferedimage jpanel
我对BufferedImage和JPanel有点小问题.我正在创建一个带有2D动画的游戏.
基本上我有一个animationHandler,它将遍历图片,并根据旋转也将正确显示它.但问题是 - 当我加载图片时,我的Jpanel不会画任何东西.如果我注释掉自定义绘制方法,那么事件并不重要 - paintComponent方法不会绘制任何东西,而且它似乎跳过了paintCompontent方法.即使游戏没有崩溃并且计时器仍在运行 - 它也不会在扩展的JPanel中使用paintComponent方法.
包含计时器的类 - 通过JPanel.repaint()调用JPanel;
这是loadImg方法
/**
* Test method to check animationHandler and bufferedImgs
*/
private void loadImages() {
BufferedImage b_1;
BufferedImage b_2;
BufferedImage b_3;
BufferedImage b_4;
BufferedImage b_5;
BufferedImage[] imgs = new BufferedImage[5];
try {
b_1 = ImageIO.read(new File("warlock1.png"));
b_2 = ImageIO.read(new File("warlock2.png"));
b_3 = ImageIO.read(new File("warlock3.png"));
b_4 = ImageIO.read(new File("warlock4.png"));
b_5 = ImageIO.read(new File("warlock5.png"));
imgs[0] = b_1;
imgs[1] = b_2;
imgs[2] = b_3;
imgs[3] = b_4;
imgs[4] = b_5;
animationHandler.addAnimation(imgs);
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
干杯!
您可能正在Swing事件线程或EDT(事件调度线程)上加载图像,并且由于EDT负责所有Swing图形和用户交互,这将冻结您的Swing应用程序,直到加载完成.解决方案:将图像加载到后台线程上,例如可以从SwingWorker对象获取.有关此主题的更多信息,请查看Swurrency中的Concurrency教程.
此外,如果可能,并且如果图像不是太大,通常最好加载图像一次,然后保持对它们或ImageIcon的引用.
最后,无论你做什么,都不要在paintComponent(...)方法中加载图像.这种方法必须精益和平均 - 尽可能快,并且只关注绘画,而不是其他任何东西.否则你的程序的响应速度可能变得非常缓慢.
另外,关于:
它不会在扩展的JPanel中使用paintComponent方法.
您可能想向我们展示此代码.
| 归档时间: |
|
| 查看次数: |
189 次 |
| 最近记录: |