为什么我的项目没有显示在JFrame中?

我对JFrame相当陌生,我想知道为什么我的项目没有显示在窗口上。 我知道我没有一个ActionHandler,但我只想我的文本框显示在我的窗口。 这是我的代码:

import java.awt.Font; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPasswordField; import javax.swing.JTextField; public class FirstGUI extends JFrame{ public void GUI(){ setTitle("Welcome"); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); setSize(600,600); JLabel title = new JLabel(); title.setText("Apple Inc. Member Login Port"); title.setFont(new Font("Arial", Font.PLAIN, 24)); JTextField login = new JTextField("Login",10); JPasswordField pass = new JPasswordField("Password"); add(title); add(login); add(pass); } public static void main(String[] args){ FirstGUI a = new FirstGUI(); a.GUI(); } } 

但是当我运行它我得到这个:

在这里输入图像描述

但是当我运行它我得到这个:

您看到一个空的屏幕,因为您在框架可见后将组件添加到框架。

  1. 如前所述,您需要使用合适的布局pipe理器。 FlowLayout是最简单的开始。
  2. 调用setVisible(true)在将组件添加到框架之后。

所以代码应该更像是:

 panel.add(...); panel.add(...); add(panel); pack(); setVisible(true); 

JFrame的默认布局pipe理器是BorderLayout

这意味着你的组件基本上全部被添加到彼此的顶部。

尝试将布局pipe理器更改为像FlowLayout (例如)…

在这里输入图像描述

请参阅“布局pipe理器视觉指南”和“ 使用布局pipe理器”以了解更多详细信息。

此外,尽可能避免setSize ,而是使用Window#pack

更新

我还想向您介绍应该用于启动您的UI代码的初始线程 …

我同意MadProgrammer的build议(+1)

那么,让我们来看看你的程序

实际上,您已经创build了一个包含组件的JFrame。 它的工作也很好,但你的问题“为什么我的项目不显示在JFrame”不是因为你做错了什么,而是因为错过了东西,即revalidate()

尝试:

 public static void main(String[] args){ FirstGUI a = new FirstGUI(); a.GUI(); a.revalidate(); } 

我不是说这会给你完美的用户界面。我想说的是这会帮助你更好地理解Swing。 了解Swing布局pipe理器,然后在您的UI上工作,以获得更好的结果

重新validation():这个组件及其上面的所有父母被标记为需要布局。 这意味着布局pipe理器将尝试重新alignment组件。 去除组件后经常使用。 一些真正尖锐的摇摆人可能会错过这一点。 如果你真的在使用Swing,我会认为你只会知道这个。

唯一的原因是:

 setVisible(True); method for the frame should be put on the end of the code. 

如果您在创build框架的代码的顶部放置此行。 这会导致这个问题。

不要直接将组件添加到您的框架。 而是添加到内容窗格中 ,这是JFrame存储所有绘制的组件的位置。 通常这是一个JPanel。

这里是一个例子:

 public class GUI { private JPanel content; public void GUI { /*Other code*/ content = new JPanel(); add(content); //make content the content pane content.add(title); content.add(login); content.add(pass); } 

如果失败,请在所有组件上调用setVisible(true)setEnabled(true)

在一个侧面说明你可能想让你的GUIfunction的构造。