如何在JFrame中放置组件? [英] How to position components in a JFrame?
本文介绍了如何在JFrame中放置组件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
jframe = new JFrame("Admin");
jpanel = new JPanel();
jpanel.setLayout(new FlowLayout());
jframe.add(jpanel);
userLabel = new JLabel("Username:");
jpanel.add(userLabel);
userLabel.setBounds(100, 100, 30, 30);
userTxtfield = new JTextField(15);
jpanel.add(userTxtfield);
passwordTxtfield = new JTextField(15);
jpanel.add(userTxtfield);
jpanel.add(passwordTxtfield);
passwordLabel = new JLabel("Password:");
jpanel.add(passwordLabel);
userLabel.setBounds(100, 100, 30, 30);
loginButton= new JButton("Login");
jpanel.add(loginButton);
jframe.pack();
jframe.setLocationRelativeTo(null);
jframe.setSize(350,350);
jframe.setVisible(true);
我正在尝试为程序创建一个整洁的登录区域,但似乎无法使两个标签和文本字段与下面的按钮对齐.在JFrame
中是否有更好的方法来定位这些组件?
I am trying to make a neat login area for my program but I can't seem to get the two labels and text fields to line up with the button underneath. Is there a better way of doing this positioning of the components within this JFrame
?
推荐答案
使用JOptionPane
显示登录对话框.布局组件的一种方法是使用GridBagLayout
.
Use a JOptionPane
to display a log-in dialog. One way to layout the components is to use a GridBagLayout
.
产生的代码是:
public void login() {
JPanel loginPanel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints(
0, 0, 1, 1, 0, 0,
GridBagConstraints.BASELINE_TRAILING,
GridBagConstraints.NONE,
new Insets(5, 5, 5, 5), 4, 6);
loginPanel.add(new JLabel("ID"), gbc);
gbc.gridy = 1;
loginPanel.add(new JLabel("Password"), gbc);
gbc.anchor = GridBagConstraints.BASELINE_LEADING;
gbc.gridx = 1;
gbc.gridy = 0;
loginPanel.add(new JTextField("enter ID", 10), gbc);
gbc.gridy = 1;
loginPanel.add(new JPasswordField(6), gbc);
int result = JOptionPane.showConfirmDialog(
ui, loginPanel, "LogIn", JOptionPane.OK_CANCEL_OPTION);
if (result == JOptionPane.OK_OPTION) {
// here a real app would check the results of the ID/password
cardLayout.show(ui, "loggedin");
}
}
这是完整的示例(如上所述,是MCVE).
Here is the complete example (an MCVE, as mentioned above).
import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class BlockTheFrame {
private JComponent ui = null;
private CardLayout cardLayout;
BlockTheFrame() {
initUI();
}
public final void initUI() {
if (ui != null) {
return;
}
cardLayout = new CardLayout();
ui = new JPanel(cardLayout);
ui.setBorder(new EmptyBorder(4, 4, 4, 4));
JLabel login = new JLabel("Log in");
login.setFont(login.getFont().deriveFont(200f));
ui.add(login, "login");
ui.add(new JLabel("logged in"), "loggedin");
}
public void login() {
JPanel loginPanel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints(
0, 0, 1, 1, 0, 0,
GridBagConstraints.BASELINE_TRAILING,
GridBagConstraints.NONE,
new Insets(5, 5, 5, 5), 4, 6);
loginPanel.add(new JLabel("ID"), gbc);
gbc.gridy = 1;
loginPanel.add(new JLabel("Password"), gbc);
gbc.anchor = GridBagConstraints.BASELINE_LEADING;
gbc.gridx = 1;
gbc.gridy = 0;
loginPanel.add(new JTextField("enter ID", 10), gbc);
gbc.gridy = 1;
loginPanel.add(new JPasswordField(6), gbc);
int result = JOptionPane.showConfirmDialog(
ui, loginPanel, "LogIn", JOptionPane.OK_CANCEL_OPTION);
if (result == JOptionPane.OK_OPTION) {
// here a real app would check the results of the ID/password
cardLayout.show(ui, "loggedin");
}
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
BlockTheFrame o = new BlockTheFrame();
JFrame f = new JFrame(o.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
o.login();
}
};
SwingUtilities.invokeLater(r);
}
}
这篇关于如何在JFrame中放置组件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文