我有一个JFrame
- SuperTest
and JPanel
- SuperLogin
。登录面板具有用户名和密码输入字段以及登录按钮。我希望它看起来像这样:
但如下图所示,输入字段的高度和宽度太大。
超级测试.java:
import javax.swing.*;
public class SuperTest extends JFrame {
public SuperTest() {
add(new SuperLogin());
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(600, 400);
}
public static void main(String[] args) {
SuperTest test = new SuperTest();
}
}
超级登录.java:
import javax.swing.*;
import java.awt.*;
public class SuperLogin extends JPanel {
private JButton loginButton =
new JButton("Login");
private TextField usernameField =
new TextField();
private TextField passwordField =
new TextField();
public SuperLogin() {
BoxLayout layout =
new BoxLayout(this, BoxLayout.Y_AXIS);
setLayout(layout);
add(new JLabel("Login"));
add(usernameField);
add(passwordField);
add(loginButton);
componentSetup();
}
private void componentSetup() {
loginButton.setSize(20, 10);
usernameField.setSize(100, 50);
passwordField.setSize(100, 50);
loginButton.setMinimumSize(new Dimension(20, 10));
usernameField.setMinimumSize(new Dimension(100, 50));
passwordField.setMinimumSize(new Dimension(100, 50));
loginButton.setPreferredSize(new Dimension(20, 10));
usernameField.setPreferredSize(new Dimension(100, 50));
passwordField.setPreferredSize(new Dimension(100, 50));
}
}
我读到设置 min, Preferred size 就足够了,但看起来还不够。
我把所有东西都放在一个类中。代码后面有解释。
import java.awt.Component;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
public class SuperOne implements Runnable {
private JButton loginButton;
private JFrame frame;
private JPasswordField passwordField;
private JTextField usernameField;
@Override
public void run() {
showGui();
}
private JPanel createLoginPanel() {
JPanel loginPanel = new JPanel();
BoxLayout layout = new BoxLayout(loginPanel, BoxLayout.PAGE_AXIS);
loginPanel.setLayout(layout);
loginPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
JLabel loginLabel = new JLabel("Login");
loginLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
usernameField = new JTextField(10);
usernameField.setAlignmentX(Component.CENTER_ALIGNMENT);
passwordField = new JPasswordField(10);
passwordField.setAlignmentX(Component.CENTER_ALIGNMENT);
loginButton = new JButton("login");
loginButton.setAlignmentX(Component.CENTER_ALIGNMENT);
loginPanel.add(loginLabel);
loginPanel.add(Box.createVerticalStrut(15));
loginPanel.add(usernameField);
loginPanel.add(Box.createVerticalStrut(5));
loginPanel.add(passwordField);
loginPanel.add(Box.createVerticalStrut(5));
loginPanel.add(loginButton);
return loginPanel;
}
private void showGui() {
frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(createLoginPanel());
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
/**
* Start here.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new SuperOne());
}
}
- 所有处理 GUI 组件的代码都必须在事件调度线程(美东时间)。虽然不是强制性的,但我喜欢通过调用显式启动 EDT
EventQueue.invokeLater()
.
- 请参阅包含教程的网页
BoxLayout
出现在其他答案 https://stackoverflow.com/questions/63159903/boxlayout-cant-setup-child-component-size/63160300#63160300.
-
JTextField
and JPasswordField
两者都有一个columns财产。我发现设置所需宽度比使用更好setPreferredSize()
这是正在运行的应用程序的屏幕截图。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)