我用NetBean实现的,需要在JPanel上显示多个JPG照片,可以显示出来的内容,有时特别混乱。如下图所示。但有时又是好的。不知是否是我的代码中有什么问题?相关代码由于繁杂,在此只能贴出一部分,可各位高手参考。
如果谁有这方面较好的例子子,可以发给我看一看,多谢了!
简单介绍一下:我要实现的功能是显示多幅照片,并且能在JPanel上显示拖动多幅照片等。在JPanel的继承类中
主要变量:
private BufferedImage bufferImage = null;
public static Graphics gbuffer;初始化时执行了:this.setDoubleBuffered(true);
bufferImage = new BufferedImage(BUFFER_IMAGE_WIDTH, BUFFER_IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
gbuffer = bufferImage.getGraphics();
有以下方法,以实现图像的刷新。别的地方调用repaint(),即可执行到此处代码。
@Override protected void paintComponent(Graphics g) {
if(RepaintBusy==true) return;
RepaintBusy=true;
gbuffer.setColor(StaticParams.BACKGROUND);
gbuffer.fillRect(0, 0, BUFFER_IMAGE_WIDTH, BUFFER_IMAGE_HEIGHT);
ThisGridManager.GridVec.Draw(gbuffer);//这是我的业务实现用的代码,功能是向BufferImage上写内容。
g.drawImage(bufferImage, 0, 0, this);
System.gc();
RepaintBusy=false;
return;
}
如果谁有这方面较好的例子子,可以发给我看一看,多谢了!
简单介绍一下:我要实现的功能是显示多幅照片,并且能在JPanel上显示拖动多幅照片等。在JPanel的继承类中
主要变量:
private BufferedImage bufferImage = null;
public static Graphics gbuffer;初始化时执行了:this.setDoubleBuffered(true);
bufferImage = new BufferedImage(BUFFER_IMAGE_WIDTH, BUFFER_IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
gbuffer = bufferImage.getGraphics();
有以下方法,以实现图像的刷新。别的地方调用repaint(),即可执行到此处代码。
@Override protected void paintComponent(Graphics g) {
if(RepaintBusy==true) return;
RepaintBusy=true;
gbuffer.setColor(StaticParams.BACKGROUND);
gbuffer.fillRect(0, 0, BUFFER_IMAGE_WIDTH, BUFFER_IMAGE_HEIGHT);
ThisGridManager.GridVec.Draw(gbuffer);//这是我的业务实现用的代码,功能是向BufferImage上写内容。
g.drawImage(bufferImage, 0, 0, this);
System.gc();
RepaintBusy=false;
return;
}
1.你业务的代码为什么要写在paintComponent方法中呢,你完全可以将他提出,毕竟这个方法主要是负责页面显示的方法
2.你为什么要主动去调用gc(),这是一个很不明智的做法,既得不到你想要的立即回收,又添加了系统cpu的使用
3.建议你重写这个画图的方法的时候,最好在该方法的第一句调用super.paintComponent(g);的方法,以免破坏JDK原有的结构,出现不可预料的问题
(1)程序功能:使用双缓冲来建立动画的效果,清除闪烁的现象。
(2)编写LX8_7.java 程序文件,源代码如下。
import java.awt.*;
import java.applet.*;
public class LX8_7 extends Applet {
Image buffer,img,star;
Graphics g1;
Thread td;
int x=0;
public void init() {
buffer=createImage(getWidth(),getHeight());//创建图像缓冲区
g1=buffer.getGraphics();//创建绘图区
img=getImage(getCodeBase(),"image/飞机.gif");
star=getImage(getCodeBase(),"image/天空.JPG");
}
public void paint(Graphics g) {
g1.drawImage(star,0,0,this); //将图像先画到缓冲区
g1.drawImage(img,310-x,20,this); //将图像先画到缓冲区
g.drawImage(buffer,0,0,this);//将缓冲区占的图像画出
try {
Thread.sleep(10);
x+=2;
if (x==310) {
x=2;
Thread.sleep(1000);
}
} catch (InterruptedException e) {}
repaint();
}
public void update(Graphics g) {
paint(g);
}
}
(5)程序说明:
改进后的程序比原程序增加了Image 类对象buffer 和Graphics 类对象g1。覆盖了
update 方法。换帧速度提高到100(1000/10),飞机每次移动2 个点,动画效果更加平滑
而且无闪烁。
新增的buffer 对象,用作屏幕缓冲区。新增的g1 对象,用作屏幕绘图区。在init 方
法中,程序调用Image 对象的createImage 方法,按照Applet 的宽度和高度创建了屏幕缓
冲区,然后调用getGraphics 方法创建了Image 对象buffer 的绘图区。在paint 方法中通
过g1.drawImage 改变了图像输出的方向,图像被画在屏幕缓冲区内。由于屏幕缓冲区不可
见,使得画面交替时的闪烁现象也不
可见。当屏幕缓冲区上的画图完成以后,再调用g.drawImage 方法将整个屏幕缓冲区拷
贝到屏幕上,这个过程是直接覆盖,不会产生闪烁。上述方式被称为图形双缓冲技术。
图形双缓冲技术实际上是创建了一个不可见的后台屏幕,进行幕后操作,图像画在后台屏幕
上,画好之后再拷贝到前台屏幕上。这种技术圆满解决了画面交替时的闪烁,但图像显示速
度变慢,内存占用较大,用户离开网页后,嵌入的Applet 会继续运行,占用CPU 时间。