我有一些关于 jframe 和 jlabel 的问题?

I am having some issues regarding jframe and jlabel?

我正在制作简单的登录屏幕。我在我的程序中的 JFrame 中添加了两个 JLabel,它 运行 成功了,但问题是,当我 运行 程序时,我得到了空白屏幕和空的 jframe,但是我在那个框架中添加了两个 jlabel 但是它没有显示任何东西,然后如果我最小化 window,一段时间后如果我再次打开 window,我就可以看到那些组件。

这是我的代码:

package javaapplication41;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.*;

public class JavaApplication41 {
   
    
   JavaApplication41()
   {
       JFrame cpec=new JFrame();
       cpec.setBounds(300,200,600,350);
       cpec.setUndecorated(false);
       cpec.setVisible(true);
       cpec.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          JLabel l = new JLabel(new ImageIcon("C:\Users\MUHAMMAD SHAHAB\Documents\NetBeansProjects\Real Estate\src\real\estate\file (2).jpg"));
           l.setBounds(100,100,200,125);
           //l.setLayout(null);
           cpec.add(l);               
           JLabel kiq=new JLabel(new ImageIcon("C:\Users\MUHAMMAD SHAHAB\Documents\NetBeansProjects\Real Estate\src\real\estate\bla.jpg"));
                kiq.setBounds(100,100,100,100);
               //kiq.setLayout(null);
         l.add(kiq);
   }
    public static void main(String[] args) {
       JavaApplication41 ne=new JavaApplication41();
    }
    
}

我在 运行 程序时得到这个输出:

当我最小化这个 window 并再次打开它时,我在这里得到了想要的输出:

我做错了什么?

您很早就设置了 JFrame 的可见性。那时还没有添加 JLabel。当您最小化框架并调整其大小时,它会再次渲染,从而显示您添加的组件。 记得在设置Frame的可见性之前添加组件(最后设置可见性)。

另外,我建议您在处理 swing 组件时使用 GUI 线程。请在此处参考 swing 实用程序:https://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

最后将 JFrame 的布局设置为空,因为您正在尝试使用 setBounds() 方法将标签添加到特定坐标。

jframe 的默认布局是 BorderLayout,因此如果您需要,可以通过参考 java.awt.Container 摘要 class.

更改布局

javax.swing.JFrameclass的getContentPane()初始化。 仅通过引用 java.awt.Container class.

添加组件
java.awt.Container c=cpec.getContentPane();
c.setLayout(new FlowLayout(FlowLayout.LEFT));
c.add(l); //label will get added to JFrame instance that is referenced
//then define size and at last define visibility
cpec.setSize(500, 500);
cpec.setVisible(true);

您必须在添加所有项目后添加 cpec.setVisible(true); jframe.I 希望这一定能解决您的问题

将容器的布局管理器设置为空。默认情况下,它使用 BorderLayout 作为其布局管理器。您只需使用 JFrame 的引用调用 getContentPane() 方法,其中 returns 是一个容器引用。示例:

Container c = frame.getContentPane();
c.setLayout(null);

有关详细信息,您可以浏览 my Website