关于在JPanel上画图的问题
写了一个类继承自JPanelpublicclassmapextendsJPanel在另外一个类中在map上画图Graphicsg=map.getGraphics()Gra...
写了一个类继承自JPanel
public class map extends JPanel
在另外一个类中在map上画图
Graphics g=map.getGraphics()
Graphics2D g2=(Graphics2D)g;
以下画图……
但是有一个问题,画出图像后,最小化一下窗口再恢复
图像就全不见了。如果其他程序的窗口覆盖在上面,然后在移开
覆盖的地方的图也不见了
请问有什么解决的办法
问题是怎么刷?
难道没有别的解决办法吗? 展开
public class map extends JPanel
在另外一个类中在map上画图
Graphics g=map.getGraphics()
Graphics2D g2=(Graphics2D)g;
以下画图……
但是有一个问题,画出图像后,最小化一下窗口再恢复
图像就全不见了。如果其他程序的窗口覆盖在上面,然后在移开
覆盖的地方的图也不见了
请问有什么解决的办法
问题是怎么刷?
难道没有别的解决办法吗? 展开
2008-11-06
展开全部
//repaint()解决不了这类问题,给你个双缓冲的例子,这个能解决此类问题:
//用鼠标在内部画图试试
//DoubleBuffer.java
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
public class DoubleBuffer {
private Canvas c;
private BufferedImage img;
private JFrame f;
int x,y;
DoubleBuffer(){
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(600,400);
f.setResizable(false);
f.setLocationRelativeTo(null);
c = new Canvas(){
//重写Canvas的,pint方法,当重新显示窗口的时候就调用后台的图像(前台已被破坏了)
public void paint(Graphics g){
g.drawImage(img,0,0,null);
}
};
f.add(c);
f.setVisible(true);
img = new BufferedImage(f.getWidth(),f.getHeight(),BufferedImage.TYPE_INT_BGR);
c.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
x=e.getX();y=e.getY();
}
});
c.addMouseMotionListener(new MouseMotionListener(){
public void mouseDragged(MouseEvent e) {
draw(e.getX(),e.getY());
}
public void mouseMoved(MouseEvent e) {}});
}
//双缓冲的实现
void draw(int X,int Y){
Graphics g = c.getGraphics();
g.setColor(Color.yellow);
Graphics gg = img.getGraphics();
gg.setColor(Color.yellow);
g.drawLine(x,y,X,Y);
gg.drawLine(x,y,X,Y);//将前台的内容,一模一样地画在后台
g.dispose();
gg.dispose();
x=X;y=Y;
}
public static void main(String[] args) {
new DoubleBuffer();
}
}
//用鼠标在内部画图试试
//DoubleBuffer.java
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
public class DoubleBuffer {
private Canvas c;
private BufferedImage img;
private JFrame f;
int x,y;
DoubleBuffer(){
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(600,400);
f.setResizable(false);
f.setLocationRelativeTo(null);
c = new Canvas(){
//重写Canvas的,pint方法,当重新显示窗口的时候就调用后台的图像(前台已被破坏了)
public void paint(Graphics g){
g.drawImage(img,0,0,null);
}
};
f.add(c);
f.setVisible(true);
img = new BufferedImage(f.getWidth(),f.getHeight(),BufferedImage.TYPE_INT_BGR);
c.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
x=e.getX();y=e.getY();
}
});
c.addMouseMotionListener(new MouseMotionListener(){
public void mouseDragged(MouseEvent e) {
draw(e.getX(),e.getY());
}
public void mouseMoved(MouseEvent e) {}});
}
//双缓冲的实现
void draw(int X,int Y){
Graphics g = c.getGraphics();
g.setColor(Color.yellow);
Graphics gg = img.getGraphics();
gg.setColor(Color.yellow);
g.drawLine(x,y,X,Y);
gg.drawLine(x,y,X,Y);//将前台的内容,一模一样地画在后台
g.dispose();
gg.dispose();
x=X;y=Y;
}
public static void main(String[] args) {
new DoubleBuffer();
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询