Balthasar
Balthasar

Reputation: 1237

JPanel taking up more space than it needs. How can I shrink it?

UPDATE: I have received justified criticism for posting non working code. I've taken that to heart and am updating this post with a complete working example. I'm also updating the description accordingly:

I have a very simple java swing GUI whose components take up what looks to be an equal amount of vertical (Y) space as is used by the largest Y extent component, but completely unnecessarily so. I have tried to shrink those components that don't need that much vertical space using preferredSize hints but to no avail.

The basic layout is simple: There's a main window and three vertical panels. The layout is a simple GridLayout (and I would prefer to keep it that way, unless someone shows me what I need cannot be done with GridLayout). All three panels seem to be occupying the same amount of vertical space, even though in the case of the sliders, this is massive waste of space. How can I get each of the sub-panes to only use as much space as they each need? i.e. I would like the two slider windows to be only as tall as the sliders and their description need to be.

The code:

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

class test {
  public static void main(String[] arg) {
    JFrame mainWindow = new JFrame();
    JSlider slider1 = new JSlider(0,100,50);
    JSlider slider2 = new JSlider(0,100,50);

    JPanel pnlSlider1 = new JPanel();
    pnlSlider1.setLayout(new GridLayout(1,1));  // 1 row, 1 column
    pnlSlider1.add(new JLabel("Description for slider1"));
    pnlSlider1.add(slider1);

    JPanel pnlSlider2 = new JPanel();
    pnlSlider2.setLayout(new GridLayout(1,1));  // 1 row, 1 column
    pnlSlider2.add(new JLabel("Description for slider2"));
    pnlSlider2.add(slider2);

    // label should now be to the left of slider

    String content = "<html>Some rather long winded HTML content</html>";
    JEditorPane ep = new JEditorPane("text/html", content);

    // this is the main window panel
    JPanel panel = new JPanel();
    panel.setLayout(new GridLayout(3,1)); // 3 rows, 1 column
    panel.add(ep);
    panel.add(pnlSlider1);
    panel.add(pnlSlider2);

    // tie it all together and display the window
        mainWindow.setPreferredSize(new Dimension(300, 600));
        mainWindow.setLocation(100, 100);
        mainWindow.getContentPane().add(panel);
        mainWindow.pack();
        mainWindow.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        mainWindow.setVisible(true);

  }
}

(removed rant about not having seen any GUI coding advances in 30 years as that's not pertinent to the problem and likely won't be solved in this post either)

Upvotes: 7

Views: 2112

Answers (1)

Andrew Thompson
Andrew Thompson

Reputation: 168845

..components take up what looks to be an equal amount of vertical (Y) space as is used by the largest Y extent component, but completely unnecessarily so.

Yes, that is the way GridLayout is designed to work.

Use a GridBagLayout or BoxLayout or GroupLayout instead, each of which can do a single column or row of components of variable size (width and height).

Upvotes: 5

Related Questions