提问者:小点点

随着JDialog大小的变化,如何让JLabel始终停靠在GridBagLayout的左侧?


当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);
            }
        });
    }
}

共1个答案

匿名用户

看看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非常强大,但这也使它非常复杂;)