【问题标题】:Displaying an Image in java在java中显示图像
【发布时间】:2012-06-03 17:32:19
【问题描述】:

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

【问题讨论】:

  • 您是否从 EDT (SwingUtilities.invokeLater...) 致电 new Window()
  • 另外,您可能需要调用 super.paint(g) 来绘制帧的其余部分。

标签: java swing background window


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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);
        }
    }
    

    以及运行应用程序的 Main 方法。

    /**
     *
     * @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 接口启动您的应用程序。一般推荐这种方式。

    希望对你有帮助。

    【讨论】:

    • 小东西,但你应该创建一个没有间隙的左对齐流布局,以便图像出现在0,0:new FlowLayout(FlowLayout.LEFT, 0, 0)
    • 所以它只是一个基本的例子,开发者可以选择他需要的布局。
    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 2017-08-10
    相关资源
    最近更新 更多