首页 > 解决方案 > JTextBox 和所有以下 JComponents 不显示

问题描述

我想设计一个简单的登录格式,为此我需要两个用于用户名/密码的 JTextField 和一个登录按钮。Login 按钮按预期显示,但是当我添加 JTextField 时,我的 JFrame 中没有显示任何内容。如果有人可以帮助初学者,那就太好了...

这是我的代码(我知道它很丑,但这只是一个“代码草图”):

package bucketlistpackage;

import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class GameFrame extends JFrame {

    public GameFrame(String title) {

        super(title);               //sets title of frame

        startFrame();               //sets details of main frame        

        final Container logincont = getContentPane();       //creates content pane

        JFrame loginframe = new JFrame();

        usernameField(loginframe);

        loginButton(loginframe);

        logincont.add(loginframe);

    }


    private void usernameField(JFrame loginframe) {

        JTextField usernameF = new JTextField("Username", 1);   

        usernameF.setBounds(50, 50, 50, 20);

        loginframe.add(usernameF);

        usernameF.setVisible(true);

    }


    private void startFrame() {         

        this.setSize(1000, 1000);

        this.setVisible(true);

    }


    private void loginButton(Container cont) {

        JButton loginB = new loginButton();

        loginB.setSize(300, 150);

        loginB.setText("Login");

        cont.add(loginB);

    }
}

标签: javaswingjtextfield

解决方案


问题在于您如何在您的情况下相互添加组件。

您正在将 JFrame 添加到容器中,但无论如何它应该是相反的。

另一个问题是您没有使用布局来管理 JFrame 上的组件位置。

另一个问题是您在添加所有内容后没有刷新窗口。

关于 Java 如何与本机 UI 一起工作的一些简历:Java 为 UI 创建了一个新线程。因此,如果您打开调试器,您将看到 AWT 线程以及主线程和其他线程。这意味着您必须以正确的方式管理它,因为在应用程序启动 SWING 之后,您确定的反应功能将为它的行为方式奠定基础。你的主线程会死掉,但视觉线程会保持活跃。

如果您刚刚开始编程,我建议您在转向 SWING 或 AWT 之前多练习一点本地 Java 语言。这个库使用起来非常痛苦和棘手。

另一件事是 SWING 库遵循组件的层次结构:JFrame > JPanels > Components

在您的代码中,您已经以一种杂乱无章的方式处理了所有这些。JFrame 是主应用程序窗口,将在其中显示图形(也可以是 Canvas 或任何您想要使用的类)。JPanel 是组织者,您可以使用不同的布局来组织其中的任何内容。最后组件都很好......一切!组件可以是 JTextField,但也可以是 JPanel 或 JButton。

SWING 的想法是创建多个面板并在其中组织最终组件,使用不同布局的帮助来查看使它们在许多不同窗口大小中具有吸引力的最佳方法。

最后,如果您使用的是 Eclipse,有一个名为 WindowBuilder 的插件可能会对您有所帮助。如果您是 Java 新手,我不建议您使用它,因为它会让您非常依赖它,而不是学习如何使用 SWING 进行实际编码。

希望这可以帮助!!!

顺便说一句,要修复上面的代码,我会这样做:

public GameFrame(String title) {
    super(title);               //sets title of frame
    startFrame();               //sets details of main frame
    final Container logincont = getContentPane();       //creates content pane
    logincont.setLayout(new BorderLayout());
    usernameField(logincont, BorderLayout.NORTH);
    loginButton(logincont, BorderLayout.CENTER);
    this.revalidate();
    this.repaint();
}

private void usernameField(Container loginframe, String direction) {
    JTextField usernameF = new JTextField("Username");
    // usernameF.setBounds(50, 50, 50, 20);
    loginframe.add(usernameF, direction);
    usernameF.setVisible(true);
}

private void startFrame() {
    this.setSize(1000, 1000);
    this.setVisible(true);
}

private void loginButton(Container cont, String direction) {
    JButton loginB = new JButton();
    loginB.setSize(300, 150);
    loginB.setText("Login");
    cont.add(loginB, direction);
}

推荐阅读