我想设计一种简单的登录格式,为了做到这一点,我想要两个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);
}
}
答案 0 :(得分:0)
问题在于您如何根据情况添加组件。
您正在将JFrame添加到容器中,但在所有情况下都应该相反。
另一个问题是您没有使用布局来管理JFrame上的组件位置。
另一个问题是您在添加所有内容后没有刷新窗口。
关于Java如何与本机UI一起工作的简历: Java为UI创建一个新线程。因此,如果打开调试器,您将看到AWT线程以及主线程和其他线程。这意味着您必须以正确的方式进行管理,因为在应用程序启动SWING之后,您确定的响应功能将为应用程序的行为奠定基础。您的主线程将死亡,但可视线程将保持活动状态。
如果您刚刚开始编程,我建议您在转向SWING或AWT之前练习一些本机Java语言。使用这些库可能会非常痛苦且棘手。
另一件事是SWING库遵循组件的层次结构: JFrame> JPanels>组件
在您的代码中,您已经与所有这些人一起工作,但是以一种杂乱无章的方式。 JFrame是主应用程序窗口,将在其中显示图形(也可以是Canvas或您想要用于此目的的任何类)。 JPanels是组织者,您可以使用不同的布局来组织其中的内容。最后,组件一切都很好。组件可以是JTextField,也可以是JPanel或JButton。
SWING的想法是创建多个面板,并在其中使用各种布局来组织最终组件,以了解使它们在许多不同的窗口尺寸中具有吸引力的最佳方法是什么。
最后,如果您使用的是Eclipse,则有一个名为WindowBuilder的插件可能会对您有所帮助。如果您是Java的新手,我不建议您使用它,因为它会使您非常依赖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);
}