java - 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);
}
}
解决方案
问题在于您如何在您的情况下相互添加组件。
您正在将 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);
}
推荐阅读
- javascript - 我如何从这个 JSON 构建猫鼬模型
- pandas - 在不考虑索引的情况下拆分大熊猫列并将其关联为新列
- java - 不加载页面
- javascript - Html Canvas/jquery:更改图像时的动画
- apache - 通过 .htaccess 将 URL 和子目录重定向到另一个 URL 和子目录
- web-component - 微前端 - Web 组件包
- css - 无法更改 svg 颜色、填充和描边
- javascript - TypeScript 将布尔值转换为字符串
- javascript - 来自@require'd 脚本的@grant GM 函数
- python - 从 CSV 复制到 SQL 时数据丢失