g如何用双缓冲解决java swing图像移动闪烁
我写一个小球的移动,但是在移动过程图像会闪烁,但网上查到有双缓冲技术可以解决,但不知代码怎么写,请各位帮帮忙,谢谢了!publicclassTestextendsJFra...
我写一个小球的移动,但是在移动过程图像会闪烁,但网上查到有双缓冲技术可以解决,但不知代码怎么写,请各位帮帮忙,谢谢了!
public class Test extends JFrame {
private static final long serialVersionUID = 1L;
private static int x = 100,y = 100;
public Test() {
setTitle("图片");
setSize(600, 600);
new t1().start();
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.red);
g.drawOval(x, y, 20, 20);
}
class t1 extends Thread {
public void run() {
do {
x+=1;
y+=1;
repaint();
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while(x!=400 && y!=400);
}
}
public static void main(String[] args) {
new Test().setVisible(true);
}
} 展开
public class Test extends JFrame {
private static final long serialVersionUID = 1L;
private static int x = 100,y = 100;
public Test() {
setTitle("图片");
setSize(600, 600);
new t1().start();
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.red);
g.drawOval(x, y, 20, 20);
}
class t1 extends Thread {
public void run() {
do {
x+=1;
y+=1;
repaint();
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while(x!=400 && y!=400);
}
}
public static void main(String[] args) {
new Test().setVisible(true);
}
} 展开
2个回答
展开全部
双缓存:缓存区是绘图绘图时使用的屏外内存区。使用双缓存不是直接绘制屏幕,而是绘制到后缓存区,然后将整个缓存区复制到屏幕上,这样就可以同时更新整个屏幕,游戏者只看到要看到的东西了。后缓存区可能只是普通java图像。可以用Component类的createImage(int w,int h)方法生成后缓存区,如果是不使用活动绘制的小程序使用双缓存,则可以覆盖update()方法,改用双缓存,并用双缓存的图形描述表调用paint()方法,实现代码如下:
private Image doubleBuffer;
public void update(Graphics g){
Dimension size=getSize();
if(doubleBuffer.getWidth(this)!=size.width||doubleBuffer.getHeight(this)!=size.height)
{ doubleBuffer=createImage(size.width,size.height);
}
if(doubleBuffer!=null){
//绘制到双缓存区
Graphics g2=doubleBuffer.getGraphics();
paint(g2);
g2.dispose();
//将双缓存复制到屏幕
g.drawImage(doubleBuffer,0,0,null);
}
else
{//不要双缓存,只绘制屏幕
paint(g);
}
}
public void paint(Graphics g){
//在此绘图
}
private Image doubleBuffer;
public void update(Graphics g){
Dimension size=getSize();
if(doubleBuffer.getWidth(this)!=size.width||doubleBuffer.getHeight(this)!=size.height)
{ doubleBuffer=createImage(size.width,size.height);
}
if(doubleBuffer!=null){
//绘制到双缓存区
Graphics g2=doubleBuffer.getGraphics();
paint(g2);
g2.dispose();
//将双缓存复制到屏幕
g.drawImage(doubleBuffer,0,0,null);
}
else
{//不要双缓存,只绘制屏幕
paint(g);
}
}
public void paint(Graphics g){
//在此绘图
}
展开全部
先创建一个固定大小的画布
Image image = new Image(20,20);
获得画布的graphics对象,这里为第一层缓冲
Graphics g = image.getGraphics();
g.setColor(Color.red);
g.drawOval(0, 0, 20, 20);
public void paint(Graphics g) {
super.paint(g);
//把这个画布当做整体画在你的panel上,此为第二层缓冲
g.drawImage(image,x, y, 20, 20);
}
没侧过,但是双缓冲的核心思想就是这样的,希望对你有帮助
Image image = new Image(20,20);
获得画布的graphics对象,这里为第一层缓冲
Graphics g = image.getGraphics();
g.setColor(Color.red);
g.drawOval(0, 0, 20, 20);
public void paint(Graphics g) {
super.paint(g);
//把这个画布当做整体画在你的panel上,此为第二层缓冲
g.drawImage(image,x, y, 20, 20);
}
没侧过,但是双缓冲的核心思想就是这样的,希望对你有帮助
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询