当JDialog窗口的大小改变时,JLabel和JTextField不会保持左对齐。是否可以让JLabel始终停靠在JDialog的左侧,同时让JTextFields增加宽度以覆盖右侧的其余水平空间。我认为网格包布局会对这种方法有所帮助,但到目前为止,我只能告诉它将每个组件放在网格b ad中的坐标。有什么建议或提示吗?
下面是我的代码,我从网上看到的另一个示例中创建了一个虚拟示例。
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
public class GridBagLayoutExample extends JDialog {
GridBagLayoutExample() {
initUI();
}
private void initUI() {
final JPanel controls = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(10,10,0,10);
JLabel firstNameLabel = new JLabel();
firstNameLabel.setText("1st Name");
c.gridx = 0;
c.gridy = 0;
controls.add(firstNameLabel,c);
JTextField firstNameField = new JTextField("Please input a 1st Name");
c.gridx = 1;
c.gridy = 0;
controls.add(firstNameField, c);
JLabel secondNameField = new JLabel();
secondNameField.setText("2nd Name");
c.gridx = 0;
c.gridy = 1;
c.gridwidth = 1;
c.fill=GridBagConstraints.HORIZONTAL;
controls.add(secondNameField, c);
JTextField secondNameLabel = new JTextField("Please input a 2nd Name");
c.gridx = 1;
c.gridy = 1;
controls.add(secondNameLabel, c);
JLabel thirdNameLabel = new JLabel();
thirdNameLabel.setText("3rd Name");
c.gridx = 0;
c.gridy = 2;
controls.add(thirdNameLabel, c);
JTextField thirdNameField = new JTextField("Please input a 3rd Name");
c.gridx = 1;
c.gridy = 2;
controls.add(thirdNameField, c);
controls.add(new JPanel(){
{
}});
setLayout(new BorderLayout());
add(controls, BorderLayout.NORTH);
pack();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new GridBagLayoutExample().setVisible(true);
}
});
}
}
看看GridbagConstraints#weightx
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class GridBagLayoutExample extends JDialog {
GridBagLayoutExample() {
initUI();
}
private void initUI() {
final JPanel controls = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(10, 10, 0, 10);
JLabel firstNameLabel = new JLabel();
firstNameLabel.setText("1st Name");
c.gridx = 0;
c.gridy = 0;
c.fill = GridBagConstraints.HORIZONTAL;
controls.add(firstNameLabel, c);
JTextField firstNameField = new JTextField("Please input a 1st Name");
c.gridx = 1;
c.gridy = 0;
c.weightx = 1;
controls.add(firstNameField, c);
JLabel secondNameField = new JLabel();
secondNameField.setText("2nd Name");
c.weightx = 0;
c.gridx = 0;
c.gridy = 1;
c.gridwidth = 1;
controls.add(secondNameField, c);
JTextField secondNameLabel = new JTextField("Please input a 2nd Name");
c.gridx = 1;
c.gridy = 1;
c.weightx = 1;
controls.add(secondNameLabel, c);
JLabel thirdNameLabel = new JLabel();
thirdNameLabel.setText("3rd Name");
c.weightx = 0;
c.gridx = 0;
c.gridy = 2;
controls.add(thirdNameLabel, c);
JTextField thirdNameField = new JTextField("Please input a 3rd Name");
c.weightx = 1;
c.gridx = 1;
c.gridy = 2;
controls.add(thirdNameField, c);
controls.add(new JPanel() {
{
}
});
setLayout(new BorderLayout());
add(controls, BorderLayout.NORTH);
pack();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new GridBagLayoutExample().setVisible(true);
}
});
}
}
另请查看如何使用GridBagLayout以获取更多详细信息。
GridBagLayout
非常强大,但这也使它非常复杂;)