为什么我的项目没有显示在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(); } }
但是当我运行它我得到这个:
但是当我运行它我得到这个:
您看到一个空的屏幕,因为您在框架可见后将组件添加到框架。
- 如前所述,您需要使用合适的布局pipe理器。 FlowLayout是最简单的开始。
- 调用
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)
。
在一个侧面说明你可能想让你的GUI
function的构造。