Search code examples
javaswingjtextfieldflowlayout

JTextField displayed as slit when using FlowLayout...please explain


Can someone please explain to me, why every time I use the FlowLayout Layout manager my textfields are displayed as slits.

I have bumped my head against this problem for some time now, and I can't seem to figure out why it goes wrong.

I get a feeling it is a simple thing that I am overlooking time and time again, so if someone would please explain this phenomenon to me, I would be forever grateful.

import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class Console
{   
    public Console()
    {
        makeConsole();
    }

    private void makeConsole()
    {
        JFrame console = new JFrame("ArchiveConsole");
        Container base  = console.getContentPane();
        base.setSize(400, 250);
        console.setSize(base.getSize());
        base.setLayout(new FlowLayout(FlowLayout.CENTER, 5,5));

        JTextField tf = new JTextField();
        tf.setSize(base.getWidth(), 25);
        base.add(tf);

        console.setVisible(true);
    }
}

Solution

  • From the Swing layout manager tutorial

    The FlowLayout class puts components in a row, sized at their preferred size. If the horizontal space in the container is too small to put all the components in one row, the FlowLayout class uses multiple rows. If the container is wider than necessary for a row of components, the row is, by default, centered horizontally within the container

    So you need to adjust the preferred size of your textfield, preferably by using the setColumns method.

    Note that if you want your text field to span the whole width you might want to use another layout then the FlowLayout for the reason quoted above

    For example, the following code gives a nice looking JTextField, but I have hardcoded the number of columns

    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import java.awt.Container;
    import java.awt.EventQueue;
    import java.awt.FlowLayout;
    
    public class TextFieldWithFlowLayout {
      public static void main( String[] args ) {
        EventQueue.invokeLater( new Runnable() {
          @Override
          public void run() {
            JFrame console = new JFrame("ArchiveConsole");
            Container base  = console.getContentPane();
            base.setLayout(new FlowLayout( FlowLayout.CENTER, 5,5));
    
            JTextField tf = new JTextField();
            tf.setColumns( 20 );
            base.add(tf);
            console.pack();
            console.setVisible(true);
          }
        } );
      }
    }