如何使用双缓冲来处理屏闪? 最好能给段带注释的代码,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 请问swing中的双缓冲怎么用啊? lz 你还在用AWT,若不是,使用Swing的话基本可以无视。所有继承自JComponent的组件都默认使用了双缓冲。容器双缓冲,那么加入到容器的组件自动使用双缓冲。 import java.awt.Color;import java.awt.Frame;import java.awt.Graphics;import java.awt.Image;import java.awt.image.BufferedImage;/******************************************************************************* * 一个双缓冲示例 * * 一个方块的运动,用双缓冲跟不用的区别 * * @author venus * */public class DoubleBufferDemo extends Frame implements Runnable { private static final long serialVersionUID = 1L; // 控制重画线程 private boolean isRun = false; // 双缓冲的一些东西 普通的画就是在屏幕直接F5 而双缓冲就是让它在内存中画完再到界面上去显示 // 你想象它就是在一个图片中画东西 然后将它画到屏幕上 private Image bufferImage = null; // 方块坐标 private int x, y; private int frame = 33; // 方块大小 public static final int SIZE = 20; // 启动 public void start() { isRun = true; setVisible(true); setSize(600, 400); setResizable(false); y = getHeight() - SIZE; x = (getWidth() - SIZE) >> 1; new Thread(this).start(); } /** * 画方法 双缓冲就是在内存中画 主要是这里不同 */ public void paint(Graphics graphics) { graphics.fillRect(x, y, SIZE, SIZE); } /** * 双缓冲技术是为了解决Java在游戏编程的过程中由于页面刷新频率太快,而引起的页面闪烁问题。 * 它的执行过程是这样的:repaint() 到update()再到paint(),而我们的双缓冲代码就写在update()里 */ public void update(Graphics g) { if (bufferImage == null) { bufferImage = this.createImage(600, 400); } Graphics goffScreen = bufferImage.getGraphics(); Color c = goffScreen.getColor(); goffScreen.setColor(Color.GREEN); goffScreen.fillRect(0, 0, 600, 400); goffScreen.setColor(c); paint(goffScreen); g.drawImage(bufferImage, 0, 0, null); } //移动 public void move() { y -= 5; if (y < 0) { y = getHeight() - SIZE; } } /** * 入口 * * @param args */ public static void main(String[] args) { new DoubleBufferDemo().start(); } // 重画Run public void run() { while (isRun) { move(); repaint(); try { Thread.sleep(frame); // 睡眠 } catch (InterruptedException e) { e.printStackTrace(); } } }} 跟我碰上了一样的问题,当时真的被闪屏给折磨死了,在这里发帖也有没有什么建设性的建议,后来就自己瞎摸索,就自己想了个类似于双缓冲的办法,这个方法不是很专业,但是绝对能解决问题大致思想是:Image doubleBuffer; //创建一张图纸public void paint(Graphics g){ //每次refresh()的时候调用 doubleBuffer = createImage(3000, 2000); Graphics g2 = doubleBuffer.getGraphics(); g2.drawString("123",newX, newY); //你想画什么就画什么啦 g2.dispose(); g.drawImage(doubleBuffer,0, 0,null); //将内存中的画画到画板上,每次更新的时候就相当于重新画了一张画 }^_^| 这样就完了,这就是我自创的办法,不知道对你有没有帮助。 判断代码的错误并修改 这个类型的程序怎么会抛出NullPointerException异常 奇怪的问题,急死人急死人急死人 jsp 超级郁闷的问题,难道你们都没遇到过?##模式对话框的问题,请进! Java写的加密文件C语言如何解开呢 MYSQL里的一个字段内容为乱码,请大家帮忙解决,谢谢了 高分求教!!!(不够再送) 请教一个关于JFileChooser问题高手请进 一个Castor JDO菜问题 大家看了 求教-java-内存分配的点点滴滴
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;/*******************************************************************************
* 一个双缓冲示例
*
* 一个方块的运动,用双缓冲跟不用的区别
*
* @author venus
*
*/
public class DoubleBufferDemo extends Frame implements Runnable { private static final long serialVersionUID = 1L; // 控制重画线程
private boolean isRun = false; // 双缓冲的一些东西 普通的画就是在屏幕直接F5 而双缓冲就是让它在内存中画完再到界面上去显示
// 你想象它就是在一个图片中画东西 然后将它画到屏幕上
private Image bufferImage = null; // 方块坐标
private int x, y; private int frame = 33; // 方块大小
public static final int SIZE = 20; // 启动
public void start() {
isRun = true;
setVisible(true);
setSize(600, 400);
setResizable(false);
y = getHeight() - SIZE;
x = (getWidth() - SIZE) >> 1;
new Thread(this).start();
} /**
* 画方法 双缓冲就是在内存中画 主要是这里不同
*/
public void paint(Graphics graphics) {
graphics.fillRect(x, y, SIZE, SIZE);
} /**
* 双缓冲技术是为了解决Java在游戏编程的过程中由于页面刷新频率太快,而引起的页面闪烁问题。
* 它的执行过程是这样的:repaint() 到update()再到paint(),而我们的双缓冲代码就写在update()里
*/
public void update(Graphics g) {
if (bufferImage == null) {
bufferImage = this.createImage(600, 400);
}
Graphics goffScreen = bufferImage.getGraphics();
Color c = goffScreen.getColor();
goffScreen.setColor(Color.GREEN);
goffScreen.fillRect(0, 0, 600, 400);
goffScreen.setColor(c);
paint(goffScreen);
g.drawImage(bufferImage, 0, 0, null);
} //移动
public void move() {
y -= 5;
if (y < 0) {
y = getHeight() - SIZE;
}
} /**
* 入口
*
* @param args
*/
public static void main(String[] args) {
new DoubleBufferDemo().start();
} // 重画Run
public void run() {
while (isRun) {
move();
repaint();
try {
Thread.sleep(frame); // 睡眠
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}}
大致思想是:Image doubleBuffer; //创建一张图纸public void paint(Graphics g){ //每次refresh()的时候调用
doubleBuffer = createImage(3000, 2000);
Graphics g2 = doubleBuffer.getGraphics(); g2.drawString("123",newX, newY); //你想画什么就画什么啦
g2.dispose();
g.drawImage(doubleBuffer,0, 0,null); //将内存中的画画到画板上,每次更新的时候就相当于重新画了一张画
}^_^| 这样就完了,这就是我自创的办法,不知道对你有没有帮助。