Setting up a maximum component size when using GridBagLayout in java
Asked Answered
C

1

6

My problem is the following : I'm trying to have a JScrollPane resizing with the window, up to a certain size horizontally, where it should stop trying to grow with the window.

Can I do that with a GridBagLayout ? If so, how ?

Chromyl answered 1/3, 2013 at 15:34 Comment(7)
I believe JComponents have a method setMaximumSize(), have you tried using this?Syntactics
I don't use GridBagLayout that much so I don't know how it works. However, I do know that BoxLayout respects the maximum size.Marshallmarshallese
GridBagLayout doesn't take into account setMaximumSize() unfortunately. First thing that I tried. BoxLayout doesn't really cut it for the design I want to implement...Chromyl
If I am not mistaken, then GridBagLayout certainly doesn't suites to this condition :( Had you tried adding one HorizontalGlue or HorizontalBox for that matter.Window
Seems like Box.createGlue(), might can work for your case :-), Please do have a look at the link.Window
You can mix and match layout managers to get the design you wish to implement.Marshallmarshallese
It works very nicely if you combine GridBagLayout and BoxLayout for example.Winola
W
2

One way to do that is to wrap you scrollpane in another JPanel with a BoxLayout and set a MaximumSize on your scrollpane which BoxLayout will enforce:

Packed:

packed display

Stretched (max width has been set to 700 px): stretched display

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.net.MalformedURLException;
import java.util.Arrays;
import java.util.Vector;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class TestGridBagLayout2 {

    protected void initUI() throws MalformedURLException {
        final JFrame frame = new JFrame();
        frame.setTitle(TestGridBagLayout2.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JPanel panel = new JPanel(new GridBagLayout());
        Vector<Vector<String>> data = new Vector<Vector<String>>();
        for (int i = 0; i < 20; i++) {
            Vector<String> v = new Vector<String>();
            for (int j = 0; j < 1; j++) {
                v.add("Cell (" + (i + 1) + "," + (j + 1) + ")");
            }
            data.add(v);
        }
        DefaultTableModel model = new DefaultTableModel(data, new Vector<String>(
                Arrays.asList("Col-1"/*, "Col-2", "Col-3", "Col-4", "Col-5"*/)));
        JTable table = new JTable(model);
        JScrollPane scroll = new JScrollPane(table);
        scroll.setMaximumSize(new Dimension(700, Integer.MAX_VALUE));
        JPanel wrappingPanel = new JPanel(null);
        wrappingPanel.setLayout(new BoxLayout(wrappingPanel, BoxLayout.LINE_AXIS));
        wrappingPanel.add(scroll);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = 1.0;
        gbc.fill = GridBagConstraints.BOTH;
        panel.add(wrappingPanel, gbc);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    new TestGridBagLayout2().initUI();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
            }
        });
    }

}
Winola answered 1/3, 2013 at 17:2 Comment(2)
That's a good idea, but very bloated... I'll wait to see if better ideas emerge before marking yours as the solution. Thank you anyway !Chromyl
@user2015634 Let me know if anything better comes up. I will be glad to learn how to do it in a simpler way.Winola

© 2022 - 2024 — McMap. All rights reserved.