【问题标题】:Java: JFrame image only appears when maximizing windowJava:JFrame图像仅在最大化窗口时出现
【发布时间】:2021-03-22 01:55:52
【问题描述】:

我正在尝试让图像出现在我的 JFrame 中。但是,此图像仅在我最大化 GUI 窗口时出现。我的图像位于我的 src 文件夹中。我想知道我是否错误地实现了 JFrame。

更新代码

    public static void main(String args[]) {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation
                (JFrame.EXIT_ON_CLOSE);

        frame.getContentPane().add(new JLabel(new ImageIcon("logo.png")));
        frame.pack();
        frame.setVisible(true);

【问题讨论】:

  • 您正在向使用 BorderLayout 的容器添加两个标签,这可能会导致您出现问题。避免使用setSize 和setBounds,因为无论如何你都在使用pack。如果需要,您可以使用setLocation 来定位框架。在致电setVisible 之前完成所有这些操作。如果图像在您的src 文件夹中,这表明图像是“嵌入的”,您应该使用getResource 为图像生成URL,然后通过ImageIcon 加载它
  • 我删除了 setBounds 并且现在正在使用 setLocation,两者都在 setVisible 之前。同样的问题正在发生。在我以某种方式调整窗口大小之前,图像不会出现......我认为这与我的图像的嵌入方式有关,就像你说的那样。
  • 我认为这与您将两个标签添加到 BorderLayout 的事实有关 - 图像已加载的事实表明它不是(尚未)并且与图片已嵌入
  • 我该如何解决这个问题?
  • 最小化代码以开始 - 1 个标签,1 个图像。打包展示窗口

标签: java image swing jframe jlabel


【解决方案1】:

简单的例子。

图像位于stof 包中。该示例使用ImageIO 来加载图像。原因有两个。

  1. 如果出现问题,则会引发异常,以便您进行诊断
  2. ImageIO.read 在图像完全加载之前不会返回。这意味着,与ImageIcon 不同,您知道一旦调用返回,图像就可用于渲染。请记住,如果图像很大并且您在事件调度线程中执行此操作,您将导致 UI “停止”

示例

import java.awt.EventQueue;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    BufferedImage image = ImageIO.read(Test.class.getResource("/stof/Background.png"));

                    JFrame frame = new JFrame();
                    frame.add(new JLabel(new ImageIcon(image)));
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }
}

【讨论】:

    猜你喜欢
    • 2020-07-14
    • 2015-04-13
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多