【问题标题】:Resize JPanel within a BoxLayout在 BoxLayout 中调整 JPanel 的大小
【发布时间】:2016-12-28 12:04:35
【问题描述】:

我有一个 JFrame,它将内容窗格设置为一个 JPanel,它有一个 BoxLayout 和另外两个 JPanel,一个是“顶栏”,另一个是我想要使用的内容。顶部栏应该恰好占据我给它的大小,内容面板应该占据其余部分,但它们都占据了一半的空间。我做错了什么?

我的课:

public class TopBar extends JPanel
{
    public TopBar()
    {
        setLayout(new FlowLayout());
        setPreferredSize(new Dimension((int) (MyFrame.WIDTH / MyFrame.COMPRESSION), MyFrame.TOPBAR));
        add(new JButton("something"));
    }
}


public class ContentPanel extends JPanel
{   
    public ContentPanel()
    {
        setLayout(null);
    }
}

public class MyJpanel extends JPanel
{
    private JPanel topPanel;
    private JPanel contentPanel;

    public MyJpanel()
    {
        this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

        topPanel = new TopBar();
        contentPanel = new ContentPanel();

        add(topPanel);
        add(contentPanel);
    }
}

【问题讨论】:

  • 对于您的顶栏,我认为JToolBar 在内部使用BoxLayout
  • 1) 为了尽快获得更好的帮助,请发帖 minimal reproducible exampleShort, Self Contained, Correct Example。 2) 以最小尺寸提供 ASCII 艺术或 GUI 的 预期 布局的简单绘图,如果可调整大小,则具有更大的宽度和高度。

标签: java swing jpanel layout-manager boxlayout


【解决方案1】:

但是它们都占用了一半的空间

BoxLayout 将为每个组件分配额外的空间,直到组件的最大大小。

顶部栏应该正好占据我给它的大小,而内容面板应该占据其余部分,

那么不要使用 BoxLayout。 JFrame 的内容窗格的默认布局管理器是 BorderLayout,这正是您想要的。

阅读 How to Use BorderLayout 上的 Swing 教程部分,了解更多信息和工作示例。

【讨论】:

    【解决方案2】:

    你应该使用 setSize 而不是 setPreferredSize

    【讨论】:

    • 它产生相同的结果。
    • 布局管理器更倾向于使用首选尺寸而不是尺寸。
    【解决方案3】:

    我的错误是我没有设置两个面板的首选大小,如果我设置 contentPane 的大小,它也会起作用。

    【讨论】:

    • 请注意,很少需要通过设置或覆盖首选大小来显式处理组件的首选大小。如果您按照我的 cmets 中对问题的建议发布 MCVE/SSCCE 和 ASCII 艺术,那么这个 GUI 是否真的需要罕见的解决方案,或者更有可能使用布局、建议的组件大小和空白(在形式的布局填充或空边框)强制最小尺寸。
    • (1-) 每个 Swing 组件将确定自己的首选大小。然后布局管理器的工作就是使用这些信息来确定每个组件的大小和位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2012-09-01
    • 2013-08-04
    • 1970-01-01
    相关资源
    最近更新 更多