Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在使用BorderLayout时,如何防止内容在JPanel中拉伸?_Java_Swing_Layout_Awt_Jpanel - Fatal编程技术网

Java 在使用BorderLayout时,如何防止内容在JPanel中拉伸?

Java 在使用BorderLayout时,如何防止内容在JPanel中拉伸?,java,swing,layout,awt,jpanel,Java,Swing,Layout,Awt,Jpanel,出于某种原因,我添加到内容JPanel中的JPanel是垂直拉伸的,而不是首选的大小。代码如下: public static JPanel content; public APP() { setLayout(new BorderLayout()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setJMenuBar(new MenuBar()); co

出于某种原因,我添加到内容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()允许我使用按钮或操作将新面板动态添加到内容面板中。这只是一种测试方法,面板的真正添加来自于菜单按钮调用的操作。

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

我添加了另一个JPannel,然后添加了胶水,然后添加了内容,然后在scrollpane的框架中添加了带有胶水的面板:

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。可能会切换到
GirdBagLayout
,它将使您的组件居中并保持其preferredsize@GuillaumePoletBorderLayout是在JFrame上使用的,JPanel是使用GridLayout的,并且正在向它添加内容,所以BorderLayout应该对它没有影响。但事实并非如此。如果我删除边界布局线,什么都不会改变。@Guillaume Polet没有错误的建议,这个容器的布局非常好,JFrame(在中心区域)JScrollPane带有/nested JPanel,最佳选项…@mKorbel我不明白你的意思。@Noobacode内容窗格的默认布局管理器是BorderLayout,因此,删除您的线路不会改变任何事情。尝试设置布局(新的GridBagLayout())我不知道这是否是解决此类BorderLayout及其BorderLayout.CENTER位置问题的正确方法。