How to set the size of swing components

I want to customize the height and width of JTextField objects. I tried using the setSize method, passing width and height as dimensions and as int. But none of them work. Am I missing something, how is there some kind of mandatory method call on the panel or something to make setting the size efficient? Please help. Thanks in advance.

EDIT: Here's some code:

public class WestPanel extends JPanel{
private JLabel dateL;
private JTextField date;
public WestPanel(){
setBackground(Color.white);
setLayout(new GridLayout(1,2,0,0));
dateL=new JLabel("Date: ");
date=new JTextField("dd/mm/yyyy");
date.setSize(60,10);
add(dateL);
add(date);
//....remaining code....//

      

0


source to share


6 answers


Let the layout manager take care of the sizing of your Swing components, but if absolutely necessary, use setPreferredSize

in conjunction with a layout manager that respects this property.



+3


source


The method setSize()

only works when the layout manager is set to zero.



+3


source


I'm not sure if this answers the original questions posters, but hopefully it will be helpful for other Swing developers.

Most people want labels and components to line up like in the next dialog I created.

enter image description here

I am using the Swing GridBagLayout layout manager to create this type of layout. Instead of explaining, here's the code that created this dialog.

package com.ggl.business.planner.view;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;

import com.ggl.business.planner.model.BusinessPlannerModel;
import com.ggl.business.planner.view.extended.EscapeDialog;
import com.ggl.business.planner.view.extended.JFontChooser;

public class OptionsDialog {

    protected static final Insets entryInsets = new Insets(0, 10, 4, 10);
    protected static final Insets spaceInsets = new Insets(10, 10, 4, 10);
    protected static final Insets noInsets    = new Insets(0, 0, 0, 0);
    protected static final Insets iconInsets  = new Insets(0, 4, 0, 0);

    protected BusinessPlannerFrame frame;

    protected BusinessPlannerModel model;

    protected EscapeDialog dialog;

    protected JButton activityTextFontButton;
    protected JButton connectorTextFontButton;

    protected JSpinner borderSizeSpinner;

    protected SpinnerNumberModel spinnerNumberModel;

    protected boolean okPressed;

    public OptionsDialog(BusinessPlannerModel model, BusinessPlannerFrame frame) {
        this.model = model;
        this.frame = frame;
        createPartControl();
    }

    protected void createPartControl() {
        dialog = new EscapeDialog();
        dialog.setTitle("Business Planner Options");
        dialog.setLayout(new GridBagLayout());

        int gridy = 0;
        gridy = createBorderFields(gridy);
        gridy = createFontFields(gridy);
        gridy = createButtonFields(gridy);

        dialog.pack();
        dialog.setBounds(dialogBounds());
        dialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
        dialog.setVisible(true);
    }

    protected int createBorderFields(int gridy) {
        JLabel borderSizeLabel = new JLabel("Border size:");
        borderSizeLabel.setHorizontalAlignment(SwingConstants.LEFT);
        addComponent(dialog, borderSizeLabel, 0, gridy, 1, 1, spaceInsets,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL);

        spinnerNumberModel = new SpinnerNumberModel(model.getActivityBorder(), 1, 5, 1);
        borderSizeSpinner = new JSpinner(spinnerNumberModel);
        addComponent(dialog, borderSizeSpinner, 1, gridy++, 4, 1, spaceInsets,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL);

        return gridy;
    }

    protected int createFontFields(int gridy) {
        JLabel boxtextFontLabel = new JLabel("Activity text font:");
        boxtextFontLabel.setHorizontalAlignment(SwingConstants.LEFT);
        addComponent(dialog, boxtextFontLabel, 0, gridy, 1, 1, spaceInsets,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL);

        Font font = model.getActivityFont();
        activityTextFontButton = new JButton(getFontText(font));
        activityTextFontButton.setFont(font);
        activityTextFontButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                JFontChooser fontChooser = new JFontChooser();
                fontChooser.setSelectedFont(model.getActivityFont());
                int result = fontChooser.showDialog(dialog);
                if (result == JFontChooser.OK_OPTION) {
                    Font font = fontChooser.getSelectedFont();
                    String text = getFontText(font);
                    model.setActivityFont(font);
                    activityTextFontButton.setText(text);
                    activityTextFontButton.setFont(font);
                    JButton dummy = new JButton(text);
                    setButtonSizes(activityTextFontButton, 
                            connectorTextFontButton, dummy);
                    dialog.validate();
                    dialog.pack();
                }
            }
        });
        addComponent(dialog, activityTextFontButton, 1, gridy++, 4, 1, spaceInsets,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL);

        JLabel connectortextFontLabel = new JLabel("Connector text font:");
        connectortextFontLabel.setHorizontalAlignment(SwingConstants.LEFT);
        addComponent(dialog, connectortextFontLabel, 0, gridy, 1, 1, spaceInsets,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL);

        font = model.getConnectorFont();
        connectorTextFontButton = new JButton(getFontText(font));
        connectorTextFontButton.setFont(font);
        connectorTextFontButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                JFontChooser fontChooser = new JFontChooser();
                fontChooser.setSelectedFont(model.getConnectorFont());
                int result = fontChooser.showDialog(dialog);
                if (result == JFontChooser.OK_OPTION) {
                    Font font = fontChooser.getSelectedFont();
                    String text = getFontText(font);
                    model.setConnectorFont(font);
                    connectorTextFontButton.setText(text);
                    connectorTextFontButton.setFont(font);
                    JButton dummy = new JButton(text);
                    setButtonSizes(activityTextFontButton, 
                            connectorTextFontButton, dummy);
                    dialog.validate();
                    dialog.pack();
                }
            }
        });
        addComponent(dialog, connectorTextFontButton, 1, gridy++, 4, 1, spaceInsets,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL);

        setButtonSizes(activityTextFontButton, connectorTextFontButton);

        return gridy;
    }

    protected String getFontText(Font font) {
        StringBuilder builder = new StringBuilder();

        builder.append(font.getName());
        builder.append(", ");
        builder.append(font.getSize());
        builder.append(" points, ");

        if (font.isPlain()) {
            builder.append("plain");
        } else if (font.isBold()) {
            builder.append("bold ");
        } else if (font.isItalic()) {
            builder.append("italic");
        } 

        return builder.toString();
    }

    protected int createButtonFields(int gridy) {
        JPanel buttondrawingPanel = new JPanel();
        buttondrawingPanel.setLayout(new FlowLayout());

        JButton okButton = new JButton("OK");
        okButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                //TODO Add edits to make sure fields are filled correctly
                setModel();
                okPressed = true;
                dialog.setVisible(false);
            }       
        });
        dialog.setOkButton(okButton);
        buttondrawingPanel.add(okButton);

        JButton cancelButton = new JButton("Cancel");
        cancelButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                okPressed = false;
                dialog.setVisible(false);
            }
        });
        buttondrawingPanel.add(cancelButton);

        setButtonSizes(okButton, cancelButton);

        addComponent(dialog, buttondrawingPanel, 0, gridy++, 5, 1, spaceInsets,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL);

        return gridy;
    }

    protected void addComponent(Container container, Component component,
            int gridx, int gridy, int gridwidth, int gridheight, 
            Insets insets, int anchor, int fill) {
        GridBagConstraints gbc = new GridBagConstraints(gridx, gridy,
                gridwidth, gridheight, 1.0D, 1.0D, anchor, fill, insets, 0, 0);
        container.add(component, gbc);
    }

    protected void setButtonSizes(JButton ... buttons) {
        Dimension preferredSize = new Dimension();
        for (JButton button : buttons) {
            Dimension d = button.getPreferredSize();
            preferredSize = setLarger(preferredSize, d);
        }
        for (JButton button : buttons) {
            button.setPreferredSize(preferredSize);
        }
    }

    protected Dimension setLarger(Dimension a, Dimension b) {
        Dimension d = new Dimension();
        d.height = Math.max(a.height, b.height);
        d.width = Math.max(a.width, b.width);
        return d;
    }

    protected void setModel() {
        model.setActivityBorder(spinnerNumberModel.getNumber().intValue()); 
    }

    protected Rectangle dialogBounds() {
        int margin = 200;
        Rectangle bounds = dialog.getBounds();
        Rectangle f = frame.getFrame().getBounds();

        bounds.x = f.x + margin;
        bounds.y = f.y + margin;

        return bounds;
    }

    public boolean isOkPressed() {
        return okPressed;
    }

}

      

The EscapeDialog class I am using simply allows me to use the Esc key to close the dialog as if I had pressed the Cancel button.

There are two things I will talk about. The first is the addComponent method, which makes it easy to add components to the GridBagLayout.

The second is the setButtonSizes method, which makes all button sizes the same. Even though they are JButton components and not JTextField components, you can do something like this if you want the JTextField components to be the same size.

+2


source


The size of your components in Swing will depend on the type of layout manager you are using. If you want complete control over the user interface, you can use the Freeflow layout.

Read the full story here: http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html

+1


source


As pointed out in the comments, use the size hints in the textbox constructor and the appropriate layout manager.

West Panel

import java.awt.*;
import javax.swing.*;

public class WestPanel extends JPanel {

    private JLabel dateL;
    private JTextField date;

    public WestPanel(){
        setBackground(Color.white);
        setLayout(new FlowLayout());
        dateL=new JLabel("Date: ");
        date=new JTextField("dd/mm/yyyy",6);
        add(dateL);
        add(date);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                JPanel gui = new JPanel(new BorderLayout());
                gui.add(new WestPanel(), BorderLayout.LINE_START);
                gui.setBackground(Color.ORANGE);
                JOptionPane.showMessageDialog(null, gui);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

      

+1


source


JTextField cannot be set in size, infact you have to use JTextArea instead.

0


source







All Articles