【发布时间】:2015-09-05 12:28:18
【问题描述】:
更新:我因发布非工作代码而受到正当批评。我已经牢记这一点,并正在用一个完整的工作示例更新这篇文章。我也在相应地更新描述:
我有一个非常简单的 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 编码进步的咆哮,因为这与问题无关,也可能不会在这篇文章中解决)
【问题讨论】:
-
“作为一个在 1993 年开始使用 Visual Basic 1.0 进行可视化编程的人,看到这些问题设法持续到 2015 年,我感到很惭愧。这与清洁饮酒不相上下。为地球上的每个人提供水。没有任何借口不普遍存在。” 嗯..“普遍存在”是表达“按照设计使用布局”的一种有趣方式。特别注意 VB在 1993 年,不需要创建跨不同平台和 PLAF(可插拔外观和感觉)强大的 GUI,这要困难一个数量级!
标签: java swing jpanel layout-manager