Search code examples
javaswingjtextfieldlayout-managergrid-layout

JTextField in GridLayout


I am having a problem with my text fields in my gui taking up the whole grid section in my custNamePanel(). I was wondering how I can fix that. My info panel seems to be just fine with its JTextField's being of normal size.

public class CustomInfo extends JFrame {

/* set up for GUI */

public CustomInfo() {
    // title bar text
    super("Albert Huntermark Plumbing & Heating");
    // corner exit button action
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // create main panel
    mainPanel = new JPanel();
    // create header panel
    headerPanel = new JPanel();
    // create name panel
    namePanel = new JPanel();
    // create input panel
    infoPanel = new JPanel();
    // create order panel
    orderPanel = new JPanel();
    // create button panel
    buttonPanel = new JPanel();
    // panel build manager
    headerPanel();
    custNamePanel();
    custInfoPanel();
    orderPanel();
    buttonPanel();
    // add GridLayout manager to main panel
    mainPanel.setLayout(new GridLayout(5, 1));
    // add panel to gui
    this.add(mainPanel);
    mainPanel.add(headerPanel);
    mainPanel.add(namePanel);
    mainPanel.add(infoPanel);
    mainPanel.add(orderPanel);
    mainPanel.add(buttonPanel);
    // resize GUI to fit text
    this.pack();
    // display window
    setVisible(true);
}


/* main method */

public static void main(String[] args) {
    CustomInfo customInfo = new CustomInfo();
}


/* build header panel */

private void headerPanel() {
    // set panel layout
    headerPanel.setLayout(new GridLayout(1, 1));

    // change background color
    headerPanel.setBackground(Color.BLACK);

    // initialize variable
    headerLabel = new JLabel("Please Provide the Following");

    // set color of headerLabel
    headerLabel.setForeground(Color.white);

    // add component to panel
    headerPanel.add(headerLabel, BorderLayout.CENTER);
}


/*
 * 
 */

private void custNamePanel() {
    // set panel layout
    namePanel.setLayout(new GridLayout(1, 6));

    // change background color
    namePanel.setBackground(Color.BLACK);

    // initialize label variable
    fNameLabel = new JLabel("FIRST NAME:");

    // set color of fNameLabel text
    fNameLabel.setForeground(Color.white);

    // initialize label variable
    mNameLabel = new JLabel("MI (Not Required):");

    // set color of mNameLabel text
    mNameLabel.setForeground(Color.white);

    // initialize label variable
    lNameLabel = new JLabel("LAST NAME:");

    // set color of mNameLabel text
    lNameLabel.setForeground(Color.white);

    // create text field for each name label
    fNameTF = new JTextField(10);
    mNameTF = new JTextField(1);
    lNameTF = new JTextField(10);

    // // add components to panel
    namePanel.add(fNameLabel);
    namePanel.add(fNameTF);
    namePanel.add(mNameLabel);
    namePanel.add(mNameTF);
    namePanel.add(lNameLabel);
    namePanel.add(lNameTF);
}


/* build input panel */

private void custInfoPanel() {
    infoPanel.setLayout(new GridLayout(4, 2));

    // change background color
    infoPanel.setBackground(Color.BLACK);

    // initialize variable
    phoneLabel = new JLabel("PHONE #:");

    // set color of phoneLabel text
    phoneLabel.setForeground(Color.white);

    // 
    phoneTF = new JTextField(5);

    // initialize address label variable
    addressLabel = new JLabel("Address:");

    // set color of addressLabel text
    addressLabel.setForeground(Color.white);

    // 
    addressTF = new JTextField(5);

    // initialize email label variable
    emailLabel = new JLabel("EMAIL:");

    // set color of emailLabel text
    emailLabel.setForeground(Color.white);

    // 
    emailTF = new JTextField(5);

    // add components to panel
    infoPanel.add(phoneLabel);
    infoPanel.add(phoneTF);
    infoPanel.add(addressLabel);
    infoPanel.add(addressTF);
    infoPanel.add(emailLabel);
    infoPanel.add(emailTF);
}


/* build order panel */

private void orderPanel() {
    orderPanel.setLayout(new GridLayout(2, 2));

    // change background color of panel
    orderPanel.setBackground(Color.BLACK);

    // initialize order label variable
    probLabel = new JLabel("Order:");

    // set color of probLabel
    probLabel.setForeground(Color.white);

    // initialize variable

    // initialize variable
    scriptLabel = new JLabel("Description:");

    // set color of scriptLabel
    scriptLabel.setForeground(Color.white);

    /*Something here*/
    GroupButton();

    // initialize text area variable
    description = new JTextArea(3, 20);
    description.setEditable(false);

    // allow word wrap
    description.setLineWrap(true);

    // initialize scroll pane variable
    vert_scroll = new JScrollPane(description);

    // specify scroll pane function
    vert_scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);

    // add components to panel
    orderPanel.add(probLabel);
    orderPanel.add(scriptLabel);
    orderPanel.add(vert_scroll);
}


/* build button panel */

private void buttonPanel() {
    // change background color
    buttonPanel.setBackground(Color.BLACK);

    // initialize variable
    submitButton = new JButton("Submit Order");

    // add ActionListener
    submitButton.addActionListener(new SubmitButtonListener());

    // add components to panel
    buttonPanel.add(submitButton);
}


/* build action listener 
 * for button panel */

private class SubmitButtonListener implements ActionListener
{
    public void actionPerformed(ActionEvent e) {
        // create JTextPane variable
        dialog = new JTextPane();

        // create string variable for confirmation
        String msg = "Thank You for using \nThe Albert"
                + " Huntermark Pulmbing & Heating Application. \nYou will"
                + " recieve a Confirmation Email shortly with the \nnext"
                + " available appointment.";

        // create String variable for error
        String error = "We're Sorry\nthe information below is either invalid"
                + " or insufficient.\nPlease look over your information and"
                + " try again.";

        // create email variable
        String EMAIL_REGEX = "^[\\w-_\\.+]*[\\w-_\\.]\\@([\\w]+\\.)+[\\w]"
                + "+[\\w]$";

        // format JTextPane
        StyledDocument doc = dialog.getStyledDocument();
        SimpleAttributeSet center = new SimpleAttributeSet();
        StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
        doc.setParagraphAttributes(0, doc.getLength(), center, false);

        // boolean variable for email format verification
        if(emailTF.getText().matches(EMAIL_REGEX))
        {
            // set JTextPane content
            dialog.setText(msg);

            // clear text fields
            fNameTF.setText("");
            mNameTF.setText("");
            lNameTF.setText("");
            phoneTF.setText("");
            emailTF.setText("");
            description.setText("");
        }
        else
            dialog.setText(error);

        // display dialog message
        JOptionPane.showMessageDialog(null, dialog);
    }
}


/* method for JRadioButton 
 * creation */

private void GroupButton()
{
    // create 3 JRadioButton variables
    JRadioButton rInstall = new JRadioButton("Installation");
    JRadioButton rProject = new JRadioButton("Project");
    JRadioButton rMaintain = new JRadioButton("Maintenance");
    this.add(rInstall);
    this.add(rProject);
    this.add(rMaintain);

    // create new ButtonGroup
    ButtonGroup butgro = new ButtonGroup();

    // add three buttons to ButtonGroup
    butgro.add(rInstall);
    butgro.add(rProject);
    butgro.add(rMaintain);
}
}

Solution

  • You have that effect, because you use GridLayout it resize components to all cell of the grid.

    Try to use another LayoutManager for your mainPanel for example GridBagLayout, with it you can manage resizing of components in your container, try to change your adding code to mainPanel with next code, it helps you:

    this.add(mainPanel);
    mainPanel.setLayout(new GridBagLayout());
    mainPanel.setBackground(Color.BLACK);
    GridBagConstraints c = new GridBagConstraints();
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 1;
    c.insets = new Insets(5, 5, 5, 5);
    c.gridy = 1;
    mainPanel.add(headerPanel,c);
    c.gridy++;
    mainPanel.add(namePanel,c);
    c.gridy++;
    mainPanel.add(infoPanel,c);
    c.gridy++;
    mainPanel.add(orderPanel,c);
    c.gridy++;
    mainPanel.add(buttonPanel,c);
    

    And it looks like:

    enter image description here

    Also I recommend you to examine different LayoutManager's, and in future you combination of them instead of using one(GridLayout).