JPanel占用的空间超出了它的需要。我怎么能缩小它?

时间:2015-06-19 13:34:49

标签: java swing jpanel layout-manager

更新:我收到了发布非工作代码的合理批评。我已经把它牢记在心,我正在用一个完整的工作示例来更新这篇文章。我也在相应地更新说明:

我有一个非常简单的java swing GUI,它的组件占用了最大Y范围组件所使用的等量垂直(Y)空间,但完全不必要。我试图使用preferredSize提示缩小那些不需要那么多垂直空间的组件,但是无济于事。

基本布局很简单:有一个主窗口和三个垂直面板。布局是一个简单的GridLayout(我宁愿保持这种方式,除非有人告诉我我需要用GridLayout做不到的事)。所有三个面板似乎占据相同数量的垂直空间,即使在滑块的情况下,这也是大量浪费空间。如何让每个子窗格只使用每个需要的空间?即我希望两个滑块窗口仅与滑块一样高,并且需要描述它们。

代码:

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);

  }
}

(删除了30年来没有看到任何GUI编码进展的咆哮,因为这与问题无关,可能也不会在这篇文章中得到解决)

1 个答案:

答案 0 :(得分:5)

  

..组件占用的是最大Y范围组件使用的等量垂直(Y)空间,但完全不必要。

是的, GridLayout 设计的工作方式。

使用GridBagLayoutBoxLayoutGroupLayout代替,每个代码可以执行可变大小(宽度和高度)的单个列或一行组件。