在java中显示图像

时间:2012-05-29 13:21:42

标签: java swing background window

我在框架上显示图像时遇到问题。当显示图片时,左上角没有进入指定的(0,0),当我第一次运行时,窗口的背景也会显示窗口后面的任何内容的可视组件。有人知道什么是错的吗?提前致谢 -

import java.awt.image.ImageObserver;
import java.io.File;
import javax.imageio.*;
import javax.swing.*;

public class Window extends JFrame{
//the pictures
Image testImage = null;
Image backPic  = null;


//constructor
Window(){
    super("window");
    this.startWindow();
}

public void startWindow(){
    Image customIcon = Toolkit.getDefaultToolkit().getImage("iconImage.gif");
    testImage = Toolkit.getDefaultToolkit().getImage("tester.gif");
    backPic = Toolkit.getDefaultToolkit().getImage("black.png");
    setSize(700,600);
    setIconImage(customIcon);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    setResizable(false);
    setLocationRelativeTo(null);
}


public void paint(Graphics g){
    g.drawImage(testImage,0,0,null);
}
}

2 个答案:

答案 0 :(得分:3)

问题是,在调用paint()时,您的testImage尚未完全加载。要解决此问题,您可以改为调用它:

g.drawImage(testImage,0,0,this);

但我首选的方法是使用JLabel并让它处理图像绘制。我还强烈建议不要覆盖JFrame.paint()(如果你这样做,至少要调用super.paint(g))。如果您确实想自己绘制图片,请展开JComponent并覆盖paintComponent()

答案 1 :(得分:2)

所以我建议您使用JLabels来显示Images,这是您可以肯定使用的最简单方法。我创建了类似的基本项目,以此方式展示。

/**
 * @author Sajmon
 */

package com.sajmon.window;

import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Window extends JFrame {

    private JLabel pictureLabel;
    private Container controls;

    public Window() {
        super("window");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLocationRelativeTo(null);
        this.setSize(300, 300);
        this.startWindow();
    }

    private void startWindow() {
        controls = new Container();
        controls = getContentPane();
        controls.setLayout(new FlowLayout());
        pictureLabel = new JLabel(new ImageIcon("picture.png"));
        controls.add(pictureLabel);
    }
}

运行应用程序的主要方法。

/**
 *
 * @author Sajmon
 */
public class Main {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Window w = new Window();
                w.setVisible(true);
            }
        });
    }    
}

注意:如果使用Swing,则应使用Runnable接口启动应用程序。通常建议采用这种方式。

希望它有所帮助。