| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1250 人关注过本帖
标题:双缓冲问题
只看楼主 加入收藏
hjq
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2006-11-21
收藏
 问题点数:0 回复次数:5 
双缓冲问题

我用双缓冲写了这个程序,内容很简单,就是有一个小球,碰到壁就反弹,问题是,运行起来好象并不畅顺,虽然并不会产生闪烁的感觉,
不知道是程序问题还是电脑问题,代码如下,
package new_test;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class animation extends JFrame implements Runnable,KeyListener
{
Graphics gr;
Image i;
int x=0,y=0,a=1,b=1,w,h;
public animation()
{
h=Toolkit.getDefaultToolkit() .getScreenSize().height;
w=Toolkit.getDefaultToolkit() .getScreenSize().width;
this.setUndecorated(true);
GraphicsDevice gra=GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
gra.setFullScreenWindow(this);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.addKeyListener(this);
this.setVisible(true);

}
public void keyPressed(KeyEvent e)
{
System.exit(0);
}
public void keyReleased(KeyEvent e)
{

}
public void keyTyped(KeyEvent e)
{

}
public void run()
{
while(true)
{
x=x+a;
y=y+b;
if(x>w)
{
a=-1;
}else if(x<0)
{
a=1;
}else if(y>h)
{
b=-1;
}else if(y<0)
{
b=1;
}
try{
Thread.sleep(2);
}catch(Exception e)
{}
//System.out.print(x);
//System.out.println(" "+y);
repaint();
}
}
public void update(Graphics g)
{
paint(g);
}
public void paint(Graphics g)
{
// super.paint(g);
i=createImage(w,h) ;
gr=i.getGraphics();
gr.setColor(Color.black);
gr.drawRect(0,0,w,h);
gr.setColor(Color.BLUE);
gr.fillOval(x,y,100,100);
// g.drawString("Hello",x,y);
g.drawImage(i,0,0,this);
//g.drawOval(x,y,10,10);
}
public static void main(String[] args) {
animation a= new animation();
new Thread(a).start();
}
}
还有,我有一个问题,就是,如果用多线程的话,好像上边那个程序,会搞到CPU的占用率很大,应该是程序本身设计问题吧,
大家请指点一下吗,谢谢了~

搜索更多相关主题的帖子: import awt 缓冲 java 
2007-01-16 15:47
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 

最好是继承自JPanel

因为JPanel是实现了双缓冲的轻量级组件,而JFrame不是


可惜不是你,陪我到最后
2007-01-16 15:52
hjq
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2006-11-21
收藏
得分:0 

我都已经跟你说的那样用JPanel实现了双缓冲,不过好像还是这样
我修改了代码如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class animation extends JPanel implements Runnable,KeyListener
{
Graphics gr;
Image i;
int x=0,y=0,a=1,b=1,w,h;
public animation()
{
h=Toolkit.getDefaultToolkit() .getScreenSize().height;
w=Toolkit.getDefaultToolkit() .getScreenSize().width;
this.addKeyListener(this);
}
public void keyPressed(KeyEvent e)
{
System.exit(0);
}
public void keyReleased(KeyEvent e)
{

}
public void keyTyped(KeyEvent e)
{

}
public void run()
{
while(true)
{
x=x+a;
y=y+b;
if(x>w)
{
a=-1;
}else if(x<0)
{
a=1;
}else if(y>h)
{
b=-1;
}else if(y<0)
{
b=1;
}
try{
Thread.sleep(2);
}catch(Exception e)
{}
//System.out.print(x);
//System.out.println(" "+y);
repaint();
}
}
public void update(Graphics g)
{
paint(g);
}
public void paint(Graphics g)
{
// super.paint(g);
i=createImage(w,h) ;
gr=i.getGraphics();
gr.setColor(Color.black);
gr.drawRect(0,0,w,h);
gr.setColor(Color.BLUE);
gr.fillOval(x,y,100,100);
// g.drawString("Hello",x,y);
g.drawImage(i,0,0,this);
//g.drawOval(x,y,10,10);
}
public static void main(String[] args)
{
JFrame f=new JFrame() ;
animation a= new animation();
f.setUndecorated(true);
GraphicsDevice gra=GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
gra.setFullScreenWindow(f);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(a) ;
f.show() ;new Thread(a).start();
}
}
麻烦你了~谢谢了


2007-01-16 19:19
无理取闹
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:53
帖 子:4264
专家分:0
注 册:2006-7-26
收藏
得分:0 
在1。5就不用自己去实现双缓冲了
用paintComponent

win32汇编
病毒 加密
目前兴趣所在
2007-01-16 19:27
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 

韩峰说得对

继承自JPanel后,就应该重写paintComponent,而不能重写paint


可惜不是你,陪我到最后
2007-01-16 20:42
hjq
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2006-11-21
收藏
得分:0 

谢谢千里冰封和韩峰两位了,问题已经解决了


2007-01-16 22:36
快速回复:双缓冲问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031383 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved