JFrame中绘制图片做背景

来源:互联网 发布:手机淘宝怎么看好评率 编辑:程序博客网 时间:2024/05/16 08:50

来源于问问 原网址:http://wenwen.soso.com/z/q194392780.htm

问题: 希望把一张图片绘制到JFrame中,代码如下,但是不成功,后面提供了两种 方法解决这个问题

import java.awt.Graphics;import java.awt.Toolkit;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.JFrame;public class GameFrame extends JFrame implements MouseListener { int width = Toolkit.getDefaultToolkit().getScreenSize().width;  //获得屏幕宽带 int height = Toolkit.getDefaultToolkit().getScreenSize().height; //获得屏幕高度  //背景初始化 BufferedImage bgImage = null;  public GameFrame(){  this.setTitle("五子棋");  //标题  this.setSize(500, 500);  //窗体大小  this.setLocation((width-500)/2, (height-500)/2);  //窗体初始位置  this.setResizable(false); //是否可改变窗体大小  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  //设置退出状态  this.setVisible(true);  //设置窗体是否可见    try {   bgImage = ImageIO.read(new File("F:/image/background.jpg"));  } catch (IOException e) {   // TODO 自动生成 catch 块   e.printStackTrace();  }   }  public void paint(Graphics g){  super.paint(g);  g = bgImage.getGraphics();  g.drawImage(bgImage, 0, 0, this); }  public void mouseClicked(MouseEvent e) {  // TODO 自动生成方法存根   } public void mouseEntered(MouseEvent e) {  // TODO 自动生成方法存根   } public void mouseExited(MouseEvent e) {  // TODO 自动生成方法存根  } public void mousePressed(MouseEvent e) {  // TODO 自动生成方法存根   } public void mouseReleased(MouseEvent e) {  // TODO 自动生成方法存根   }}

方法一:

首先,修改paint()方法

public void paint(Graphics g) {    super.paint(g);//  g = bgImage.getGraphics();//这句话连画布都改了,下面画的东西都不会在屏幕上显示//而是在bgImage里进行绘制,所以下面的东西都显示不出来,应该删掉这句    g.drawImage(bgImage, 0, 0, this);  }

其次,修改加载图片的语句

bgImage = ImageIO.read(new File("F:/image/background.jpg"));

分析: 之所以没有显示,是因为ImageIO.read方法是在和主程序并行进行的线程里完成的,很可能你的图片还没加载完图片就已经显示主界面了,所以正确的方法是等待图片加载完再进行显示。这里要用到MediaTracker类。要引入包import java.awt.MediaTracker;
代码修改:

//将bgImage = ImageIO.read(new File("F:/image/background.jpg"));替换为下面代码try {      MediaTracker tracker = new MediaTracker(this); //创建一个图片跟踪器      bgImage = ImageIO.read(new File("F:/pictures/ForFun/0.jpg"));      tracker.addImage(bgImage, 0);//跟踪该缓冲图片,id设为0      tracker.waitForID(0);//这句会一直等待到id为0的图片加载完毕或出错为止    }    catch (InterruptedException e) {    }    catch (IOException e) {      e.printStackTrace();    }    repaint();//不要忘了这句,因为前面的ImageIO.read()方法可能会调用paint方法,所以没有这句的话可能主界面还是在加载前就绘制完毕了

方法二:

只要修改paint( )方法,

 public void paint(Graphics g) {    super.paint(g);    if(bgImage==null){      try {        bgImage = ImageIO.read(new File("F:/pictures/MyFavorites/fish.bmp"));      }      catch (IOException e) {        e.printStackTrace();      }          }    g.drawImage(bgImage, 0, 0, this);  }

 

原创粉丝点击