双缓冲其实就是在画屏幕的时候,另外用一个Image保存一样的画。在屏幕重绘的时候,把Image的内容画上去。
简单的小例子,这种例子网上到处都是,不过还是自己写了一个贴上来。网上大多的例子都是这种写法,这种写法有一个bug.就是在窗口resize的时候,窗口的尺寸变化了。但image的尺寸没有随着改变,导致超出image的内容重绘不了。
简单的小例子,这种例子网上到处都是,不过还是自己写了一个贴上来。网上大多的例子都是这种写法,这种写法有一个bug.就是在窗口resize的时候,窗口的尺寸变化了。但image的尺寸没有随着改变,导致超出image的内容重绘不了。
import
java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
public class Test extends JFrame
{
Image orgImage = null;
Graphics orgGraphics = null;
public Test()
{
super("双缓冲");
setBounds(200, 200, 200, 300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//得到屏幕大小的一个Image
orgImage = createImage(getSize().width,getSize().height);
//从Image处取得Graphics
orgGraphics = orgImage.getGraphics();
addMouseListener(new MouseAdapter()
{
int orgX;
int orgY;
public void mousePressed(MouseEvent e)
{
// TODO Auto-generated method stub
orgX = e.getX();
orgY = e.getY();
}
public void mouseReleased(MouseEvent e)
{
// TODO Auto-generated method stub
Graphics g = getGraphics();
//屏幕上画线
g.drawLine(orgX,orgY,e.getX(),e.getY());
//从Image上画线
orgGraphics.drawLine(orgX,orgY,e.getX(),e.getY());
}
});
}
public void paint(Graphics g)
{
if(orgImage != null)
//重绘的时候输出Image的内容
g.drawImage(orgImage, 0, 0, null);
}
public static void main(String[] args)
{
new Test();
}
}
import java.awt.Image;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
public class Test extends JFrame
{
Image orgImage = null;
Graphics orgGraphics = null;
public Test()
{
super("双缓冲");
setBounds(200, 200, 200, 300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//得到屏幕大小的一个Image
orgImage = createImage(getSize().width,getSize().height);
//从Image处取得Graphics
orgGraphics = orgImage.getGraphics();
addMouseListener(new MouseAdapter()
{
int orgX;
int orgY;
public void mousePressed(MouseEvent e)
{
// TODO Auto-generated method stub
orgX = e.getX();
orgY = e.getY();
}
public void mouseReleased(MouseEvent e)
{
// TODO Auto-generated method stub
Graphics g = getGraphics();
//屏幕上画线
g.drawLine(orgX,orgY,e.getX(),e.getY());
//从Image上画线
orgGraphics.drawLine(orgX,orgY,e.getX(),e.getY());
}
});
}
public void paint(Graphics g)
{
if(orgImage != null)
//重绘的时候输出Image的内容
g.drawImage(orgImage, 0, 0, null);
}
public static void main(String[] args)
{
new Test();
}
}