java JFrame画图为何双缓冲不管用啊
importjava.awt.Color;importjava.awt.Graphics;importjava.awt.Image;importjavax.swing.J...
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JFrame;
public class TankClient extends JFrame {
@Override
public void paint(Graphics g) {
// TODO 自动生成方法存根
g.fillRect(0, 0, 800, 600);
g.setColor(Color.red);
g.fillOval(x, y, 30, 30);
y += 3;
}
/**
* @param args
*
*/
int x = 50;
int y = 50;
Image offScreenImage = null;
public static void main(String[] args) {
// TODO 自动生成方法存根
TankClient tc = new TankClient();
tc.lauchFrame();
}
public void update(Graphics g) {
if(offScreenImage == null) {
offScreenImage = this.createImage(800,600);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0, 0, 800,600);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
public void lauchFrame(){
this.setLocation(400,100);
this.setSize(800,600);
this.setResizable(false);
this.setBackground(Color.BLACK);
this.setVisible(true);
new Thread(new RepaintDriver()).start();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public class RepaintDriver implements Runnable{
public void run(){
while(true){
repaint();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}
}
}
哪位大虾帮我看看啊,为什么双缓冲没用啊? 展开
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JFrame;
public class TankClient extends JFrame {
@Override
public void paint(Graphics g) {
// TODO 自动生成方法存根
g.fillRect(0, 0, 800, 600);
g.setColor(Color.red);
g.fillOval(x, y, 30, 30);
y += 3;
}
/**
* @param args
*
*/
int x = 50;
int y = 50;
Image offScreenImage = null;
public static void main(String[] args) {
// TODO 自动生成方法存根
TankClient tc = new TankClient();
tc.lauchFrame();
}
public void update(Graphics g) {
if(offScreenImage == null) {
offScreenImage = this.createImage(800,600);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0, 0, 800,600);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
public void lauchFrame(){
this.setLocation(400,100);
this.setSize(800,600);
this.setResizable(false);
this.setBackground(Color.BLACK);
this.setVisible(true);
new Thread(new RepaintDriver()).start();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public class RepaintDriver implements Runnable{
public void run(){
while(true){
repaint();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}
}
}
哪位大虾帮我看看啊,为什么双缓冲没用啊? 展开
展开全部
哈哈,这个东西好熟悉啊,是不是马士兵的坦克大战啊?嘿嘿,之所以你的双缓冲没有起作用是应为,你继承的是JFrame,而不是Frame,该成Frame就行了啊
追问
可是偶不想改啊,还有别的办法吗?
追答
那是没有办法的东西啊,一个是AWT组件,一个是swing组件,侧重点不一样,而且JFrame里边根本没有paint方法
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
暂停一下 不一定就能消除闪屏现象
只在 暂停的时间 比 生成后端缓冲图像所用的时间 长的时候才能消除闪烁
你确定你的双缓冲用的对么 双缓冲会在后端图像ready之后通知UI将其切换到前端 这是个消息通知机制,不需要手工同步
只在 暂停的时间 比 生成后端缓冲图像所用的时间 长的时候才能消除闪烁
你确定你的双缓冲用的对么 双缓冲会在后端图像ready之后通知UI将其切换到前端 这是个消息通知机制,不需要手工同步
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询