【发布时间】:2016-05-28 03:36:53
【问题描述】:
我有一个 JFrame,它由一组可能任意大的“标题”组成,可以单击这些“标题”以显示面板,每个标题一个(概念上类似于垂直排列的工具栏,标题是显示各种选项卡的选项卡)工具面板)。我希望标题有固定数量的垂直空间分配给它们,但水平增长以填充框架的宽度。我希望标题暴露的面板消耗框架中所有多余的垂直空间——但前提是它们是可见的;当不可见时,它们应该占用零空间。
不幸的是,无论我如何尝试调整布局,我都无法阻止它为标题和不可见的面板分配额外的空间。在演示应用程序中,只需将窗口放大即可。期望的行为是蓝色的“Hello 0”面板应该变得更高,而所有其他组件保持“紧凑”;在实践中,我看到两个“紧凑标签”标签周围和两个较低的“点击我”标题下方有空白区域。
感谢您的宝贵时间!
public class Demo {
public static void main(String[] args) {
final JFrame frame = new JFrame("Inspector");
frame.setLayout(new MigLayout("debug, fill, flowy, insets 0, gap 0"));
frame.add(new JLabel("Compact label 1"));
frame.add(new JLabel("Compact label 2"));
for (int i = 0; i < 3; ++i) {
JPanel wrapper = new JPanel(
new MigLayout("debug, fill, flowy, insets 0, gap 0",
"", "0[]0[grow]0"));
// Fixed-height header should grow horizontally only
JPanel header = new JPanel(
new MigLayout("flowx, fillx, insets 0, gap 0"));
header.add(new JLabel("Click me!"), "growx, height 40!");
header.setBackground(Color.RED);
// Variably-sized body should fill any extra space.
final JPanel body = new JPanel(new MigLayout("fill"));
body.add(new JLabel("Hello, " + i), "grow");
body.setBackground(Color.BLUE);
body.setVisible(i == 0);
wrapper.add(header, "growx");
wrapper.add(body, "growy, hidemode 2");
header.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
boolean shouldShow = !body.isVisible();
body.setVisible(shouldShow);
frame.pack();
}
});
frame.add(wrapper, "grow");
}
frame.pack();
frame.setVisible(true);
}
}
【问题讨论】: