Java BuffereImage仅在窗口最小化和重新最大化时显示

Java BuffereImage仅在窗口最小化和重新最大化时显示,java,swing,jlabel,bufferedimage,Java,Swing,Jlabel,Bufferedimage,我目前正在使用JavaSwing编写一个应用程序。到目前为止,应用程序很简单,它创建了一个填充屏幕的窗口(JFrame)。这个JFrame有一个主JPanel,其中JPanel是一个JLabel标题和一个JLabel,我正在加载一个BufferedImage。当我运行程序时,包含标题的JLabel会出现,但包含我正在加载的图像的JLabel不会出现。但是,当我点击窗口上的“最小化”按钮,然后再次将窗口最大化时,图像显示为它应该显示的样子。为什么程序打开时图像不显示?我的代码如下所示: publi

我目前正在使用JavaSwing编写一个应用程序。到目前为止,应用程序很简单,它创建了一个填充屏幕的窗口(
JFrame
)。这个
JFrame
有一个主
JPanel
,其中
JPanel
是一个
JLabel
标题和一个
JLabel
,我正在加载一个
BufferedImage
。当我运行程序时,包含标题的
JLabel
会出现,但包含我正在加载的图像的
JLabel
不会出现。但是,当我点击窗口上的“最小化”按钮,然后再次将窗口最大化时,图像显示为它应该显示的样子。为什么程序打开时图像不显示?我的代码如下所示:

public class MainWindow extends JFrame {

    private static final int DEFAULT_WIDTH = 1400;
    private static final int DEFAULT_HEIGHT = 800;

    private JPanel mainPanel;

    public MainWindow() {
        setup();
    }

    private void setup() {
        this.setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

        this.mainPanel = new JPanel(new BorderLayout());
        mainPanel.setBackground(Color.BLUE);

        this.add(mainPanel);
        setupObjectInsertPanel();
    }

    private void setupObjectInsertPanel() {

        JLabel label = new JLabel("TileSets");
        mainPanel.add(label, BorderLayout.NORTH);

        try{
            BufferedImage tilesetImage = ImageIO.read(new File(...)); // path ommitted
            JLabel tilesetIcon = new JLabel(new ImageIcon(tilesetImage));
            mainPanel.add(tilesetIcon, BorderLayout.SOUTH);
            System.out.println("Loaded tileset into panel");
        } catch (IOException e) {
            System.out.println("Could not open tileset");
            e.printStackTrace();
        }

    }
}

try语句始终成功,并且在程序启动时打印成功消息,但直到窗口最小化/重新最大化,图像才会显示。为什么会发生这种行为

您需要移动此.setVisible(true);到代码块的末尾。设置所有内容后,设置visible true。最小化和还原将强制重新绘制。或者在更新容器后,在容器上调用
revalidate
repaint