2013-05-07 163 views
1

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

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(); 
    } 
} 

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

enter image description here

+0

我相信你需要添加你的组件到'context pane'而不是直接添加到框架。请参阅http://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html – 2013-05-07 00:58:50

+0

@ PM77-1我相信自Java 5以来,不再需要将“JFrame#add”委托给您的内容窗格 – MadProgrammer 2013-05-07 01:20:32

回答

6

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

,因为你添加组件到帧后的帧是可见的你会得到一个空白屏幕。

  1. 正如已经建议您需要使用适当的布局管理器。 FlowLayout是最简单的开始。
  2. 调用setVisible(true) AFTER将组件添加到框架后。

因此,代码应该更像:

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

“setVisible”+1 +1 – MadProgrammer 2013-05-07 01:19:47

+0

感谢上帝,有些聪明的人提醒你看看你的代码行的顺序。谢谢你,先生。 – IchHabsDrauf 2017-08-17 18:17:13

0

不要将组件直接添加到您的框架。请将其添加到内容窗格,这是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函数成为构造函数。

1

我同意MadProgrammer的建议(+1)

好吧,让我们来看看在你的程序虽然

你居然已经创建了一个包含组件的JFrame。其优良的工作为好,但你的“为什么我的项目没有显示在JFrame中”问题是不是因为你做错了什么,而是因为错过了一些东西,即重新验证()

尝试:

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

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

revalidate():此组件及其上方的所有父级都标记为需要布局。这意味着布局管理器将尝试重新对齐组件。删除组件后经常使用。一些真正敏锐的摇摆人可能会错过这一点。如果你真的在使用Swing,我会认为你只会知道这一点。

1

的原因只有一个:

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

如果你给的,当你创建一个框架,该框架的代码的顶部这一行。这会导致这个问题。

-1
import javax.swing.*; 
import java.awt.*; 
class Myframec extends JFrame 
{ 

    Myframec() 
    { 
     Container c = this.getContentPane(); 
     c.setLayout(null); 

     this.setBounds(10,10,700,500); 
     this.setTitle("Welcome"); 

     this.setDefaultCloseOperation(this.EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(); 
     panel.setBounds(0,0,700,500); 
     panel.setBackground(Color.gray); 
     panel.setLayout(null); 
     c.add(panel); 
     Font f = new Font("Arial",Font.BOLD,25); 
     Font f1 = new Font("Arial",Font.BOLD,20); 
     JLabel lable = new JLabel(); 
     lable.setBounds(130,10,400,100); 
     lable.setText("Apple Inc. Member Login Port"); 
     lable.setFont(f); 
     panel.add(lable); 
     JTextField login = new JTextField("Login",10); 
     login.setBounds(120,150,400,30); 
     login.setFont(f1); 
     panel.add(login); 
     JPasswordField pass =new JPasswordField("Password"); 
     pass.setBounds(120,200,400,30); 
     pass.setFont(f1); 


     lable.setFont(f); 
     panel.add(pass); 
     c.setVisible(true); 
     this.setVisible(true); 
    } 
    public static void main(String[] argm) 
    { 
     Myframec frame = new Myframec(); 
     frame.setVisible(true); 
    } 
} 
+3

请添加关于此代码如何工作的解释(通过编辑答案)。 – MikaS 2018-01-27 17:20:11