java 如何用BufferedImage画出图像

高手请帮忙,我是新手,不会用BufferedImage,所以请高手修改下面的程序让图片画在Jframe上并给下解释谢谢新手请教!!importjava.awt.Graph... 高手请帮忙,我是新手,不会用BufferedImage,所以请高手修改下面的程序 让图片画在Jframe上 并给下解释 谢谢 新手请教!!

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;

public class Tank extends JFrame {
private Image img = null;
boolean fi = false;
BufferedImage bi;

public Tank() {
this.addKeyListener(new KeyMonitor());
this.setBounds(300, 300, 300, 300);
this.setVisible(true);

this.setDefaultCloseOperation(Tank.EXIT_ON_CLOSE);

}

class KeyMonitor extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {

case 37: {

img = getToolkit().createImage("res/TankPic/pre.GIF");

fi = true;
System.out.println(img);
repaint();
break;
}
}

}
}

public void paint(Graphics g) {
super.paint(g);

bi = new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_ARGB);
bi.getGraphics();
if (fi) {

g = img.getGraphics();
g.drawImage(bi, 50, 50, 40, 40, this);
}

}

public static void main(String[] args) {
new Tank();
}
}
我是想把这张图像先画到内存中去,再从内存中画到Jframe上, 我知道可以直接画IMG 我的意思是说用双缓存 技术,以后好处理多张图片
展开
 我来答
yugi111
推荐于2017-10-01 · TA获得超过8.1万个赞
知道大有可为答主
回答量:5.1万
采纳率:70%
帮助的人:1.3亿
展开全部
  1. drawimage都是对Image对象处理,和组件的绘制一点关系也没;

  2. 把newImage的图再画到image里面去;

  3. 实例代码如下:

    public class Tank extends JFrame {
    private Image img = null;
    boolean fi = false;
    BufferedImage bi;

    public Tank() {
     this.addKeyListener(new KeyMonitor());
     this.setBounds(300, 300, 300, 300);
     this.setVisible(true);
     
     this.setDefaultCloseOperation(Tank.EXIT_ON_CLOSE);

    }

    class KeyMonitor extends KeyAdapter {
     @Override
     public void keyPressed(KeyEvent e) {
      switch (e.getKeyCode()) {
     
      case 37: {
       
       img = getToolkit().createImage("res/TankPic/pre.GIF");
       
       fi = true;
       System.out.println(img);
       repaint();
       break;
      }
      }
     
     }
    }

    public void paint(Graphics g) {
     super.paint(g);
     
     bi = new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_ARGB);
     bi.getGraphics();
     if (fi) {
      g = img.getGraphics();
      g.drawImage(bi, 50, 50, 40, 40, this);
     }
    }

    public static void main(String[] args) {
     new Tank();
    }
    }

Irreappearable
2010-02-24 · TA获得超过4956个赞
知道大有可为答主
回答量:1423
采纳率:25%
帮助的人:3132万
展开全部
我不明白在界面组件这个层次上讨论双缓存是什么样一个概念?说不定swing在绘制的时候本身已经双帧缓存了
另外呢,你要把图像画到内存中,那就是Image对象啊,这个对象不就是在内存中的吗,你要缓存多个图像,那就是用多个Image对象啊。

我不知道BufferedImage相对于Image的其他实现来说有什么区别,如果你一定要BufferedImage的话你也可以用已有的Image创建一个新的BufferedImage对象,这都是没问题的,但是当你要画在界面上的时候,你必须使用界面组件给你的paint的参数的那个Graphics对象绘制
=============================================================
这个问题和BufferedImage没有关系,其实是你多次一举了。。。
img = getToolkit().createImage("res/TankPic/pre.GIF");已经有了Image对象,不需要再创建BufferedImage的对象bi
在paint方法中也是,paint方法已经给了你Graphics 对象,这个参数g是和组件本身相关的,你用他绘制就会绘制在界面上,你用img.getGraphics()得到的Graphics对象是和img对象相关的,用这个对象绘制只会绘制在img图片本身上

另外,把图像会在一个JPanel上吧,在把那个JPanel显示在JFrame上
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2010-02-26
展开全部
zy974400763说的像真的一样。。。
连paint的参数g都没用到,你能画到JFrame上?你所有的drawimage都是对Image对象处理,和组件的绘制一点关系也没。。

简单的说,你做的就是新建一幅图,我称为newImage吧,把原来的图,我称为image,先画进去,然后再把newImage的图再画到image里面去。对于int a来说,你做的就是这样:
int b = a;
a = b;
这样做的不是缓存,而是缓冲。缓存是指存着以后要用的东西提高效率,缓冲则是指在某个地方停一停,做一些冗余的事情,是一种降低速度的行为。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zy974400763
2010-02-26 · TA获得超过268个赞
知道小有建树答主
回答量:129
采纳率:0%
帮助的人:101万
展开全部
修改paint方法如下:
public void paint(Graphics g) {
super.paint(g);

bi = new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_ARGB);
Graphics bg = bi.getGraphics(); //在这里获得了bi的Graphics的引用
bg.drawImage(要显示的图片,.....);//调用bg的drawImage方法。
if (fi) {

g = img.getGraphics();
g.drawImage(bi, 50, 50, 40, 40, this);
}

}
以上要改的就是我加注释的那两句。具体的思路就是当我们要在哪里绘图时,就先获得该对象的Graphics对象的引用,然后调用drawImage的方法。对于BuffereImage对象也是一样的。先在BuffereImage对象中绘图,然后将BuffereImage对象绘制到Frame中。这样就实现了双缓冲了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式