pradnyapalan
pradnyapalan

Reputation: 50

Issues setting the layout in JFrame

i am trying to set the text box and label in panel but the text box is getting inappropriate size and the layout is also not setting properly

public class FrameLayout1 implements ActionListener {
 JTextField[] txtName;
    JLabel[] lblname; 
    JCheckBox keyButton;
    JCheckBox cascadeButton;
    JComboBox SetList;
    JComboBox ClassList;
    JLabel[] lblType;
    JTextField txtJoinColumn;
    JLabel[] lblAssoType;
    JTextField[] txtJoinColumnAssoc;

    FrameLayout1(){

    }
  public void setDetailsPanel() 
    {

        txtName = new JTextField[10];
        txtJoinColumnAssoc = new JTextField[10];
        lblname=new JLabel[10]; 
        lblType=new JLabel[10];
        lblAssoType=new JLabel[20]; 
        JFrame ColumnFrame=new JFrame("Enter the Column Values"); 

        int i=0;

        JPanel panel =  new JPanel(new GridLayout(0,1,5,10));

        for (i=0;i<5;i++) 
        {
            JPanel panelTxtLbl =  new JPanel(new GridLayout(0,2));
            lblname[i] = new JLabel("label"+i+":", JLabel.LEFT);
            panelTxtLbl.add(lblname[i]);

            txtName[i] = new JTextField(15);
            panelTxtLbl.add(txtName[i]);

            panel.add(panelTxtLbl);
            lblType[i] = new JLabel("labeldata", JLabel.LEFT);
            panel.add(lblType[i]);


            String[] SetStrings = { "One to Many","Many to Many" };
            SetList = new JComboBox(SetStrings);
            SetList.setSelectedIndex(1);
            panel.add(SetList);

            cascadeButton = new JCheckBox("cascade"); 
            cascadeButton.setSelected(true);
            panel.add(cascadeButton);

            JPanel panelSetClass =  new JPanel(new GridLayout(0,2));
            for(int j=0;j<3;j++)
             {
                lblAssoType[j]=new JLabel("Label Inner"+j+":", JLabel.LEFT);
                panelSetClass.add(lblAssoType[j]);

                txtJoinColumnAssoc[j] = new JTextField(15);
                panelSetClass.add(txtJoinColumnAssoc[j]);

             }
                panel.add(panelSetClass);
                panel.add(createHorizontalSeparator());
        } 


            //detailsPanel.add(panel, BorderLayout.CENTER);
            //detailsPanel.setAutoscrolls(true);
            panel.setAutoscrolls(true);
            JButton button = new JButton("Submit");
            button.addActionListener(this);
            //detailsPanel.add(button,BorderLayout.PAGE_END); 
            panel.add(button,BorderLayout.PAGE_END); 

            Color c=new Color(205, 222, 216);
            ColumnFrame.setLayout(new BorderLayout());
            ColumnFrame.add(panel,BorderLayout.CENTER);
            //ColumnFrame.setSize(700,600);
            ColumnFrame.setBackground(c);
            ColumnFrame.pack();
            ColumnFrame.setVisible(true);
            ColumnFrame.setLocation(200, 200);
    }
    /*
     * to add a horizontal line in the panel
     */
    static JComponent createHorizontalSeparator() {  
         JSeparator x = new JSeparator(SwingConstants.HORIZONTAL);  
         x.setPreferredSize(new Dimension(3,2));  
         return x;   
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub

    } 


}

createHorizontalSeparator function helps you add a horizontal line in the panel, as i was unable to segregate the fields .

current output

Imgur

desired output

Imgur

Upvotes: 1

Views: 129

Answers (1)

Jan Bodnar
Jan Bodnar

Reputation: 11657

Today, I answered a similar question where GridLayout caused much the same confusion. Do yourself a service and use a flexible layout manager (if it is possible) like MigLayout to create your layouts. These simple built-in layout managers either have very limited application (GridLayout, FlowLayout, BorderLayout) or it can become challenging to create sofisticated layouts with them (BoxLayout).

GridLayout and BorderLayout stretch their components and do not honour the size bounds of their children. This is the reason why you have those unnecessary spaces and why the button is expanded horizontally.

The following is an example that mimics your layout. It is created with the powerful MigLayout manager.

package com.zetcode;

import java.awt.EventQueue;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;


public class DetailsPanel extends JFrame {

    public DetailsPanel() {

        initUI();

        setTitle("Details");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    private void initUI() {

        setLayout(new MigLayout("ins 10, wrap 2", "[][grow]"));

        add(new JLabel("Label 1:"));
        add(new JTextField(), "w 200, growx");

        add(new JLabel("Label 2:"));
        add(new JTextField(), "growx");    

        add(new JLabel("Label 3:"));
        add(new JTextField(), "gaptop 30, growx");

        add(new JLabel("Label 4:"));
        add(new JTextField(), "growx");      

        add(new JLabel("Label 5:"));
        add(new JTextField(), "gaptop 30, growx");

        add(new JLabel("Label 6:"));
        add(new JTextField(), "growx");          

        add(new JButton("Submit"), "gaptop 30, skip, right");


        pack();
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                DetailsPanel ex = new DetailsPanel();
                ex.setVisible(true);
            }
        });
    }
}

You need to dedicate some time to learn a more complex layout manager, but it pays off. Especially, if you often build layouts in Swing.

Details

Upvotes: 1

Related Questions