用java显示图像

用java显示图像,java,swing,background,window,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 t

我在框架上显示图像时遇到问题。当图片显示时,左上角不会指向指定的(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);
}
}

因此,我建议您使用
JLabels
例如显示
图像
,这是您可以使用的最简单的方法。我创建了类似的基本项目,以这种方式演示

/**
 * @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接口启动应用程序。通常建议采用这种方式


希望有帮助。

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

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

但是我更喜欢的方法是使用JLabel并让它处理图像绘制。我还强烈建议不要重写
JFrame.paint()
(如果这样做,至少调用
super.paint(g)
)。如果您真的想自己绘制图像,请扩展
JComponent
并覆盖
paintComponent()

是否从EDT(
SwingUtilities.invokeLater…
)调用
new Window()
)?此外,您可能需要调用
super.paint(g)
来绘制框架的其余部分,但是您应该创建一个没有间隙的左对齐流布局,这样图像就会显示在0,0:
newflowlayout(FlowLayout.left,0,0)
中,这样开发人员就可以选择他需要的布局了。