2

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

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

在此处输入图像描述

4

6 回答 6

9

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

您会得到一个空白屏幕,因为您在框架可见后将组件添加到框架中。

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

所以代码应该更像:

panel.add(...);
panel.add(...);
add(panel);
pack();
setVisible(true);
于 2013-05-07T01:09:34.140 回答
1

的默认布局管理器JFrameBorderLayout.

这意味着您的组件基本上都是相互叠加的。

尝试将布局管理器更改为FlowLayout(例如)...

在此处输入图像描述

查看A Visual Guide to Layout ManagersUsing Layout Managers了解更多详细信息。

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

更新

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

于 2013-05-07T00:58:13.567 回答
1

我同意 MadProgrammer 的建议 (+1)

好吧,让我们看看你的程序

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

尝试:

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

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

revalidate():这个组件和它上面的所有父组件都被标记为需要布局。这意味着布局管理器将尝试重新对齐组件。通常在移除组件后使用。有可能一些非常剧烈的摇摆人可能会错过这一点。我认为只有在您实际使用 Swing 时您才会知道这一点。

于 2013-05-07T04:32:48.627 回答
1

唯一的一个原因:

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

如果您在创建框架时的代码顶部给出这一行。这将导致该问题。

于 2014-10-08T09:53:59.387 回答
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函数成为构造函数。

于 2013-05-07T00:58:16.917 回答
-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);
    }
}
于 2018-01-27T16:56:12.883 回答