![](/img/trans.png)
[英]How to align components center in the JPanel using GridBagLayout?
[英]Center components inside JPanel using GridBagLayout
我試圖將某些組件放在JPanel內部,當我在JPanel的GridBagLayout的“ Customize Layout”選項中按“ Test Layout”時,一切正常,但是當我運行該程序時,它看起來有所不同。
相反,當我運行程序時,它看起來像這樣:
該程序的結構如下:
因此,存在兩個問題:
密碼字段大於電子郵件地址字段。 我嘗試將兩者的最小值,最大值和首選大小都設置為(14,22),但它不起作用。
為什么將按鈕分開,如何使它們連接? (右鍵具有0個左Inset)
這是initComponents()函數:
private void initComponents()
{
java.awt.GridBagConstraints gridBagConstraints;
jPanel1 = new javax.swing.JPanel();
loginButton = new javax.swing.JButton();
signUpLabel = new javax.swing.JLabel();
emailTextField = new javax.swing.JTextField();
passwordField = new javax.swing.JPasswordField();
star1 = new javax.swing.JLabel();
star2 = new javax.swing.JLabel();
loginToggleButton = new javax.swing.JToggleButton();
signUpToggleButton = new javax.swing.JToggleButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jPanel1.setBackground(new java.awt.Color(42, 46, 55));
jPanel1.setLayout(new java.awt.GridBagLayout());
loginButton.setFont(new java.awt.Font("Dialog", 1, 14)); // NOI18N
loginButton.setText("Login");
loginButton.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
loginButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 5;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.ipadx = 42;
gridBagConstraints.ipady = 14;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(79, 116, 0, 0);
jPanel1.add(loginButton, gridBagConstraints);
signUpLabel.setFont(new java.awt.Font("Dialog", 1, 13)); // NOI18N
signUpLabel.setText("Don't have an account?");
signUpLabel.setPreferredSize(new java.awt.Dimension(149, 12));
signUpLabel.addMouseListener(new java.awt.event.MouseAdapter()
{
public void mouseClicked(java.awt.event.MouseEvent evt)
{
signUpLabelMouseClicked(evt);
}
public void mouseEntered(java.awt.event.MouseEvent evt)
{
signUpLabelMouseEntered(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt)
{
signUpLabelMouseExited(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 6;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(18, 100, 42, 0);
jPanel1.add(signUpLabel, gridBagConstraints);
emailTextField.setMaximumSize(new java.awt.Dimension(14, 22));
emailTextField.setMinimumSize(new java.awt.Dimension(14, 22));
emailTextField.setPreferredSize(new java.awt.Dimension(14, 22));
emailTextField.addFocusListener(new java.awt.event.FocusAdapter()
{
public void focusGained(java.awt.event.FocusEvent evt)
{
emailTextFieldFocusGained(evt);
}
public void focusLost(java.awt.event.FocusEvent evt)
{
emailTextFieldFocusLost(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 6;
gridBagConstraints.gridheight = 2;
gridBagConstraints.ipadx = 199;
gridBagConstraints.ipady = 10;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(97, 70, 0, 0);
jPanel1.add(emailTextField, gridBagConstraints);
passwordField.setMaximumSize(new java.awt.Dimension(14, 22));
passwordField.addFocusListener(new java.awt.event.FocusAdapter()
{
public void focusGained(java.awt.event.FocusEvent evt)
{
passwordFieldFocusGained(evt);
}
public void focusLost(java.awt.event.FocusEvent evt)
{
passwordFieldFocusLost(evt);
}
});
passwordField.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
passwordFieldActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.gridwidth = 6;
gridBagConstraints.gridheight = 2;
gridBagConstraints.ipadx = 199;
gridBagConstraints.ipady = 10;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(18, 70, 0, 0);
jPanel1.add(passwordField, gridBagConstraints);
star1.setForeground(new java.awt.Color(255, 0, 0));
star1.setText("*");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 6;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(106, 10, 0, 49);
jPanel1.add(star1, gridBagConstraints);
star2.setForeground(new java.awt.Color(255, 0, 0));
star2.setText("*");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 6;
gridBagConstraints.gridy = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(25, 10, 0, 49);
jPanel1.add(star2, gridBagConstraints);
loginToggleButton.setBackground(new java.awt.Color(0, 224, 208));
loginToggleButton.setText("Log In");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 4;
gridBagConstraints.ipadx = 34;
gridBagConstraints.ipady = 8;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(44, 0, 0, 0);
jPanel1.add(loginToggleButton, gridBagConstraints);
signUpToggleButton.setBackground(new java.awt.Color(48, 199, 32));
signUpToggleButton.setText("Sign Up");
signUpToggleButton.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
signUpToggleButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.ipadx = 25;
gridBagConstraints.ipady = 8;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(44, 80, 0, 0);
jPanel1.add(signUpToggleButton, gridBagConstraints);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
);
pack();
}// </editor-fold>
不要使用setPreferredSize()。
每個Swing組件將根據組件的屬性確定自己的大小。 在許多情況下,這將基於組件的文本。
對於沒有默認文本的文本字段,您應該創建以下組件:
//emailTextField = new javax.swing.JTextField();
//passwordField = new javax.swing.JPasswordField();
emailTextField = new javax.swing.JTextField(20);
passwordField = new javax.swing.JPasswordField(10);
因此,組件可以確定其首選大小以顯示20/10個字符。 (實際上,它的大小可以顯示“ W”字符)。
另外,通常不需要設置組件的最小/最大大小,因為GridBagLayout將遵循首選大小,除非您填充單元格。
您是否嘗試過使用其他gridBagConstraints變量? 否則,兩個不同的組件可能會導致一些問題。
public class TestStack {
private static JTextField txtOne;
private static JTextField txtTwo;
public static void main(String[] args) {
JFrame frame = new JFrame();
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWidths = new int[]{0, 0};
gridBagLayout.rowHeights = new int[]{0, 0, 0, 0};
gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE};
gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE};
frame.getContentPane().setLayout(gridBagLayout);
txtOne = new JTextField();
txtOne.setHorizontalAlignment(SwingConstants.CENTER);
txtOne.setText("one");
GridBagConstraints gbc_txtOne = new GridBagConstraints();
gbc_txtOne.insets = new Insets(0, 0, 5, 0);
gbc_txtOne.gridx = 0;
gbc_txtOne.gridy = 0;
frame.getContentPane().add(txtOne, gbc_txtOne);
txtOne.setColumns(10);
txtTwo = new JTextField();
txtTwo.setHorizontalAlignment(SwingConstants.CENTER);
txtTwo.setText("twodwqadadsadasdsa");
GridBagConstraints gbc_txtTwo = new GridBagConstraints();
gbc_txtTwo.insets = new Insets(0, 0, 5, 0);
gbc_txtTwo.gridx = 0;
gbc_txtTwo.gridy = 1;
frame.getContentPane().add(txtTwo, gbc_txtTwo);
txtTwo.setColumns(10);
JLabel lblThree = new JLabel("three");
lblThree.setHorizontalAlignment(SwingConstants.CENTER);
GridBagConstraints gbc_lblThree = new GridBagConstraints();
gbc_lblThree.gridx = 0;
gbc_lblThree.gridy = 2;
frame.getContentPane().add(lblThree, gbc_lblThree);
frame.setVisible(true);
}
}
試試吧
我不確定密碼字段,但是對於分開的按鈕,您可以使用框式布局創建一個新面板。 然后,您可以在其中放置按鈕。 之后,您可以將新面板放入主面板中。 這在我當前的項目中有效。 希望它也對您有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.