gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:38:03 24 4
gpt4 key购买 nike

我想设计一个简单的登录格式,为此我需要两个用于用户名/密码的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com