【问题标题】:How to keep content from stretching in JPanel when using BorderLayout?使用 BorderLayout 时如何防止内容在 JPanel 中拉伸?
【发布时间】:2013-05-27 06:39:10
【问题描述】:

由于某种原因,我添加到内容 JPanel 中的 JPanel 是垂直拉伸的,而不是首选尺寸。代码如下:

    public static JPanel content;

    public APP()
    {
        setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setJMenuBar(new MenuBar());

        content = new JPanel(new GridLayout(0, 8, 2, 2));
        add(new JScrollPane(content, 22, 32), BorderLayout.CENTER);

        pack();
        setLocationRelativeTo(null);
        setResizable(false);
        setVisible(true);

        addJPanel();
        addJPanel();
    }

    public void addJPanel()
    {
        JPanel box = new JPanel();
        box.setPreferredSize(new Dimension(100, 100));
        box.setBackground(Color.BLACK);
        content.add(box);
        content.validate();
    }

如何在添加它们时将它们保持在特定大小?或者至少防止它们在内容面板中一直延伸。我希望它们都保持相同的大小,而不会随着添加更多面板而改变它们的大小。

*注意: addJPanel() 允许我使用按钮或操作将新面板动态添加到内容面板中。它只是一种测试方法,真正的面板添加来自菜单按钮调用的动作。

【问题讨论】:

  • 不要使用 BorderLayout,如果你不想让它伸展。也许切换到GirdBagLayout 这将使您的组件居中并保持其首选大小
  • @GuillaumePolet 嗯,JFrame上使用了BorderLayout,JPanel是使用GridLayout的,正在往里面添加东西,所以BorderLayout应该对它没有影响。但事实并非如此。如果我删除 BorderLayout 行,什么都不会改变。
  • @Guillaume Polet 没有错的建议,这个容器放置得很好,JFrame 和(在中心区域)JScrollPane 和/嵌套的 JPanel,最好的选择......
  • @mKorbel 我不明白你的意思。
  • @Noobacode 内容窗格的默认 LayoutManager 是 BorderLayout,因此删除行不会改变任何内容。试试setLayout(new GridBagLayout());

标签: java swing layout awt jpanel


【解决方案1】:

我最终找到了一个使用胶水进行盒子布局的解决方案,因为我真的很想使用 GridLayout 来简化我的工作:

我添加了另一个 JPanel,然后对其添加了胶水,然后向其添加了内容,然后将带有胶水的面板添加到了滚动窗格中的框架:

public static JPanel content;
public static JPanel wrapper;

public APP()
{
    setLayout(new BorderLayout());
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    setJMenuBar(new MenuBar());

    content = new JPanel(new GridLayout(0, 8, 2, 2));

    wrapper = new JPanel(new BorderLayout()); 
    wrapper.add(Box.createGlue(), BorderLayout.CENTER);
    wrapper.add(content, BorderLayout.NORTH);
    add(new JScrollPane(wrapper, 22, 32), BorderLayout.CENTER);

    pack();
    setLocationRelativeTo(null);
    setResizable(false);
    setVisible(true);
}

然后我只使用 wrapper.revalidate() 以便它考虑新的维度。现在就像一个魅力。

【讨论】:

  • 我徘徊是否是解决BorderLayout及其BorderLayout.CENTER位置的此类问题的正确方法。
猜你喜欢
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 2018-07-17
  • 2018-01-22
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多