java - JTextBox 和所有以下 JComponent 不显示

标签 java swing jtextfield

我想设计一个简单的登录格式,为此我需要两个用于用户名/密码的 JTextField 和一个登录按钮。登录按钮按预期显示,但是当我添加 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);

    }
}

最佳答案

问题在于您如何在您的案例中相互添加组件。

您正在向容器添加 JFrame,但在所有情况下都应该是相反的情况。

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

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

关于 Java 如何与 native UI 配合使用的一些简历: Java 为 UI 创建一个新线程。因此,如果您打开调试器,您将看到 AWT 线程以及主线程和其他线程。这意味着您必须以正确的方式进行管理,因为在应用程序启动 SWING 后,您确定的 react 函数将为它的行为方式奠定基础。您的主线程将会终止,但可视线程将保持 Activity 状态。

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

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

在您的代码中,您已经使用了所有这些方法,但方式杂乱无章。 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);
}

关于java - JTextBox 和所有以下 JComponent 不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57959922/

相关文章:

java - 如何使用变量,特别是不同类中的日期

java - 跳转到二进制文件中的特定位置

java - 调用了 paintComponent,但没有显示任何内容

java - 将文本字段值放入数组中,ArrayIndexOutOfBoundsException

java - JNI - 线程和 jobject 的问题

java - jOOQ 中的交错/分阶段/条件 SQL 构建

java:打印JFrame的内容

java - 创建 'loading...' 动画帧以在执行方法时显示?

java - 使用java将文本设置为粗体

java - 通过选择 JComboBox 选项动态添加 JTextFields 和 JLabels