Question

Here is the code:

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

public class TestGrid {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Colored Trails");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));

        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(4, 9));
        panel.setMaximumSize(new Dimension(9*30-20,4*30));

        JButton btn;
        for (int i=1; i<=4; i++) {
            for (int j=1; j<=4; j++) {
                btn = new JButton();
                btn.setPreferredSize(new Dimension(30, 30));
                panel.add(btn);
            }

            btn = new JButton();
            btn.setPreferredSize(new Dimension(30, 10));
            panel.add(btn);

            for (int j=1; j<=4; j++) {
                btn = new JButton();
                btn.setPreferredSize(new Dimension(30, 30));
                panel.add(btn);
            }

        }
        mainPanel.add(panel);
        frame.add(mainPanel);

        frame.setSize(450,950);
        frame.setVisible(true);
    }
}

I suppose to have a table of buttons with 4 rows and 9 columns. And the middle column should be narrower that other columns. I tried Dimension(30, 10) and Dimension(30, 10) both have no effect on the width of the middle column. Why?

Was it helpful?

Solution

Layout managers are free to ignore the preferred size. Specifically, GridLayout will always make each cell in the grid exactly the same size (it's a pretty useless layout manager for that reason).

You'll have to use a different layout manager, such as nested BoxLayout or a GroupLayout.

OTHER TIPS

GridLayout is quite inflexible in that each and every cell is the same size, typically honoring the largest height and width settings of any object added to the grid.

If the rows and/or columns need to have varying sizes you should use GridBagLayout.

setPreferredSize will not change the size of the button until dimension is set by using Dimension.

Example:-

Dimension dim = new Dimension(20,20), then use setPerferredSize(dim).

I found this method version, that fits perfect to your solution:

.addComponent(<<a jButton instance>>, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, <<put here an integer to set you max width button size>>)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top