2

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

2 回答 2

3

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

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

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

于 2012-05-29T13:52:05.870 回答
2

所以我给你的建议是使用JLabels例如 show 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 接口启动您的应用程序。一般推荐这种方式。

希望能帮助到你。

于 2012-05-29T13:50:37.253 回答