Question

Can anyone help with this problem I'm trying to create a JToolBar and I want all its components to be fixed in size and position. I've tried a few different layout managers but they all center and/or re-size the components when the frame it's in is re-sized.

Here is an example using GridbagLayout, I have also used the default layout manager using the toolbar.add(component) method but the result is the same : '

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.*;

public class ToolBarTest extends JFrame
{
    private JToolBar toolbar;
    private JPanel mainPanel;
    private JPanel toolBarPanel;
    private JButton aButton;
    private JCheckBox aCheckBox;
    private JList aList;
    private Box toolbarBox;
    private GridBagConstraints toolbarConstraints;
    private GridBagLayout toolbarLayout;
    private JLabel shapeLabel;
    private JComboBox<ImageIcon> shapeChooser;
    private JLabel colorLabel;
    private JComboBox colorChooser;

    private String colorNames[] = { "Black" , "Blue", "Cyan", "Dark Gray",
            "Gray", "Green", "Light Gray", "Magenta", "Orange",
            "Pink", "Red", "White", "Yellow", "Custom" };

    private String shapeNames[] = { "Line", "Oval", "Rectangle",
        "3D Rectangle","Paint Brush", "Rounded Rectangle" };

    public ToolBarTest()
    {


        setLayout( new BorderLayout() );
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        setSize( 500, 500 );


        add( createToolBar(), BorderLayout.PAGE_START );

        setVisible( true );

    }


    public void addToToolbar( Component component, int row, int column )
    {
        toolbarConstraints.gridx = column;
        toolbarConstraints.gridy = row;
        toolbarConstraints.anchor = GridBagConstraints.WEST;
        toolbarConstraints.fill = GridBagConstraints.NONE;
        toolbarConstraints.weightx = 0;
        toolbarConstraints.weighty = 0;
        toolbarConstraints.gridwidth = 1;
        toolbarConstraints.gridheight = 1;
        toolbarLayout.setConstraints( component, toolbarConstraints );
        toolbar.add( component );

    }// end addToToolbar


    public final JToolBar createToolBar()
    {
        toolbarLayout = new GridBagLayout();
        toolbarConstraints = new GridBagConstraints();

        // create the tool bar which holds the items to draw
        toolbar = new JToolBar();
        toolbar.setBorderPainted(true);
        toolbar.setLayout( toolbarLayout );
        toolbar.setFloatable( true );




        shapeLabel = new JLabel( "Shapes: " );
        addToToolbar( shapeLabel, 0, 1 );


        String iconNames[] = { "PaintImages/Line.jpg", 
            "PaintImages/Oval.jpg", "PaintImages/Rect.jpg",
            "PaintImages/3DRect.jpg","PaintImages/PaintBrush.jpg",
        "PaintImages/RoundRect.jpg"};

        ImageIcon shapeIcons[] = new ImageIcon[ shapeNames.length ];


        // create image icons 
        for( int shapeButton = 0; shapeButton < shapeNames.length; shapeButton++ )
        {

            shapeIcons[ shapeButton ] =
                    new ImageIcon( iconNames[ shapeButton ] );

        }// end for


        shapeChooser = 
                new JComboBox< ImageIcon >( shapeIcons );

        shapeChooser.setSize(  new Dimension( 50, 20 ));

        shapeChooser.setPrototypeDisplayValue( shapeIcons[ 0 ] ); 

        shapeChooser.setSelectedIndex( 0 );

        addToToolbar( shapeChooser, 0, 2 );

        colorLabel = new JLabel( "Colors: " );

        addToToolbar( colorLabel, 0, 3 );

        colorChooser = new JComboBox( colorNames );
        addToToolbar( colorChooser, 0, 4 );


        return toolbar;
    }// end createToolBar

    public static void main( String args[] )
    {
        new ToolBarTest();

    }// end main


}// end class ToolBarTest'
Was it helpful?

Solution

As already mentioned: the default Layout of JToolBar is-a BoxLayout which respects a component's maxSize. A JComboBox hasn't a reasonable max, so you need to subclass and override getMaxSize:

protected JComboBox createCombo(Object[] shapeIcons) {
    return new JComboBox( shapeIcons ) {

        @Override
        public Dimension getMaximumSize() {
            return getPreferredSize();
        }

    };
}

// usage (keep the default layoutManager of the toolbar)
shapeChooser = createCombo(shapeIcons);
toolBar.add(shapeChooser);
... 
colorChooser = createCombo( colorNames );
toolBar.add(colorChooser)

OTHER TIPS

Here is an alternative to extending the JComboBox. It simply locks the preferred & min/max sizes to the preferred size when added to the tool bar.

ToolBarTest

Another tweak would be to add an EmtpyBorder to any instanceof a JLabel. They seem a bit 'crowded' there.

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

public class ToolBarTest extends JFrame
{
    private JToolBar toolbar;
    private JLabel shapeLabel;
    private JComboBox shapeChooser;
    private JLabel colorLabel;
    private JComboBox colorChooser;

    private String colorNames[] = { "Black" , "Blue", "Cyan", "Dark Gray",
            "Gray", "Green", "Light Gray", "Magenta", "Orange",
            "Pink", "Red", "White", "Yellow", "Custom" };

    private String shapeNames[] = { "Line", "Oval", "Rectangle",
        "3D Rectangle","Paint Brush", "Rounded Rectangle" };

    public ToolBarTest()
    {
        setLayout( new BorderLayout() );
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        setSize( 500, 200 );
        add( createToolBar(), BorderLayout.PAGE_START );

        setVisible( true );
    }

    public void addToToolbar( Component component, int row, int column )
    {
        Dimension d = component.getPreferredSize();
        component.setMaximumSize(d);
        component.setMinimumSize(d);
        component.setPreferredSize(d);
        toolbar.add( component );

    }// end addToToolbar

    public final JToolBar createToolBar()
    {
        // create the tool bar which holds the items to draw
        toolbar = new JToolBar();

        shapeLabel = new JLabel( "Shapes: " );
        addToToolbar( shapeLabel, 0, 1 );

        shapeChooser = 
                new JComboBox( shapeNames );
        shapeChooser.setSelectedIndex( 0 );
        addToToolbar( shapeChooser, 0, 2 );
        colorLabel = new JLabel( "Colors: " );

        addToToolbar( colorLabel, 0, 3 );

        colorChooser = new JComboBox( colorNames );
        addToToolbar( colorChooser, 0, 4 );

        return toolbar;
    }// end createToolBar

    public static void main( String args[] )
    {
        new ToolBarTest();

    }// end main
}// end class ToolBarTest'
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top