JFrame中绘制图片做背景

来源于问问 原网址: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);
  }

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值