更新:我收到了发布非工作代码的合理批评。我已经把它牢记在心,我正在用一个完整的工作示例来更新这篇文章。我也在相应地更新说明:
我有一个非常简单的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编码进展的咆哮,因为这与问题无关,可能也不会在这篇文章中得到解决)
答案 0 :(得分:5)
..组件占用的是最大Y范围组件使用的等量垂直(Y)空间,但完全不必要。
是的,是 GridLayout
设计的工作方式。
使用GridBagLayout
或BoxLayout
或GroupLayout
代替,每个代码可以执行可变大小(宽度和高度)的单个列或一行组件。