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