Search code examples
javaswingalignmentlayout-managerjcheckbox

Align CheckBox in a dialog


I want to align a check box(red highlighted area) According to other respective fields.

enter image description here

This is main method I am using to generate this

public class DialogTesting extends JFrame{

public static void main(String args[])
{

    JFrame frame = new JFrame();
    frame.setSize(320,250);
    frame.setLocation(400,400);

    JTextField txtUserName,txtHostName,txtPortNo,txtSID;
    JPasswordField txtPassword;
    JPanel mainPanel;
    JCheckBox chkBoxSaveConnection;

    mainPanel = new JPanel();
    mainPanel.setBorder(BorderFactory.createEmptyBorder());
    mainPanel.setPreferredSize(new Dimension(300, 210));
    mainPanel.setLayout(new FlowLayout());


    JLabel l_label = null;
    txtUserName = new JTextField("K_USERNAME", 15);
    txtUserName.putClientProperty("maxlength", 200);
    l_label = new JLabel("User Name");
    l_label.setPreferredSize(new Dimension(100, 30));
    mainPanel.add(l_label);
    mainPanel.add(txtUserName);

    txtPassword = new JPasswordField("K_PASSWORD", 15);
    txtUserName.putClientProperty("maxlength", 200);
    l_label = new JLabel("Password");
    l_label.setPreferredSize(new Dimension(100, 30));
    mainPanel.add(l_label);
    mainPanel.add(txtPassword);

    txtHostName = new JTextField("K_HOSTNAME", 15);
    txtHostName.putClientProperty("maxlength", 200);
    l_label = new JLabel("Host Name");
    l_label.setPreferredSize(new Dimension(100, 30));
    mainPanel.add(l_label);
    mainPanel.add(txtHostName);

    txtPortNo = new JTextField("K_PORTNO", 15);

    l_label = new JLabel("Port Number");
    l_label.setPreferredSize(new Dimension(100, 30));
    txtPortNo.putClientProperty("maxlength", 200);
    mainPanel.add(l_label);
    mainPanel.add(txtPortNo);


    txtSID = new JTextField("K_SID", 15);
    l_label = new JLabel("SID number");
    l_label.setPreferredSize(new Dimension(100, 30));
    txtPortNo.putClientProperty("maxlength", 200);
    mainPanel.add(l_label);
    mainPanel.add(txtSID);

    chkBoxSaveConnection = new JCheckBox();
    l_label = new JLabel("chkBoxSaveConnection");
    l_label.setPreferredSize(new Dimension(150, 30));
    mainPanel.add(l_label);
    mainPanel.add(chkBoxSaveConnection);

    mainPanel.setVisible(true);

    frame.add(mainPanel);
    frame.setVisible(true);

}
}

Here I want to make check box(Red Highlighted area) align according to other fields

I tried this solution to make it align properly

mainPanel.setLayout(new GridLayout()); 
GridBagConstraints l_bag_constraints = new GridBagConstraints();
l_bag_constraints.fill = GridBagConstraints.HORIZONTAL;
mainPanel.add(jlabel,FieldMapperHelper.getGridBagCompPosition(l_bag_constraints,0,0,10,1,0,10)
            );
    mainPanel.add(txtUserName
            ,FieldMapperHelper.getGridBagCompPosition(l_bag_constraints,0,1,10,1,0,10)
            );

But in this case it is showing me very small text box.

Please let me know if you want any thing else apart from it.


Solution

  • Ok, so your problem is that you don't use an appropriate LayoutManager and you are also forced to set preferred sizes (you should simply never do that).

    Here is an update version of your code which uses GridBagLayout and should works nicely:

    Result image

    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JPasswordField;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    
    public class DialogTesting {
    
        protected void initUI() {
    
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            JTextField txtUserName, txtHostName, txtPortNo, txtSID;
            JPasswordField txtPassword;
            JPanel mainPanel;
            JCheckBox chkBoxSaveConnection;
    
            GridBagConstraints firstCol = new GridBagConstraints();
            firstCol.weightx = 1.0;
            firstCol.anchor = GridBagConstraints.WEST;
            firstCol.insets = new Insets(5, 20, 5, 5);
    
            GridBagConstraints lastCol = new GridBagConstraints();
            lastCol.gridwidth = GridBagConstraints.REMAINDER;
            lastCol.weightx = 1.0;
            lastCol.fill = GridBagConstraints.HORIZONTAL;
            lastCol.insets = new Insets(5, 5, 5, 20);
    
            mainPanel = new JPanel(new GridBagLayout());
    
            JLabel l_label = null;
            txtUserName = new JTextField("K_USERNAME", 15);
            txtUserName.putClientProperty("maxlength", 200);
            l_label = new JLabel("User Name");
            mainPanel.add(l_label, firstCol);
            mainPanel.add(txtUserName, lastCol);
    
            txtPassword = new JPasswordField("K_PASSWORD", 15);
            txtUserName.putClientProperty("maxlength", 200);
            l_label = new JLabel("Password");
            mainPanel.add(l_label, firstCol);
            mainPanel.add(txtPassword, lastCol);
    
            txtHostName = new JTextField("K_HOSTNAME", 15);
            txtHostName.putClientProperty("maxlength", 200);
            l_label = new JLabel("Host Name");
            mainPanel.add(l_label, firstCol);
            mainPanel.add(txtHostName, lastCol);
    
            txtPortNo = new JTextField("K_PORTNO", 15);
    
            l_label = new JLabel("Port Number");
            txtPortNo.putClientProperty("maxlength", 200);
            mainPanel.add(l_label, firstCol);
            mainPanel.add(txtPortNo, lastCol);
    
            txtSID = new JTextField("K_SID", 15);
            l_label = new JLabel("SID number");
            txtPortNo.putClientProperty("maxlength", 200);
            mainPanel.add(l_label, firstCol);
            mainPanel.add(txtSID, lastCol);
    
            chkBoxSaveConnection = new JCheckBox();
            l_label = new JLabel("chkBoxSaveConnection");
            mainPanel.add(l_label, firstCol);
            mainPanel.add(chkBoxSaveConnection, lastCol);
    
            frame.add(mainPanel);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String args[]) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new DialogTesting().initUI();
                }
            });
        }
    }