Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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 调整JPanel的高度_Java_Swing_Layout Manager_Flowlayout - Fatal编程技术网

Java 调整JPanel的高度

Java 调整JPanel的高度,java,swing,layout-manager,flowlayout,Java,Swing,Layout Manager,Flowlayout,我有一个带有流布局的顶部面板,它有一个文本字段和标签。我需要在第一行下面添加更多的文本字段和标签。我意识到在flowlayout中没有真正的方法来强制一条新线,所以我只是想做一个新的面板,并把它放在最上面的面板下面。问题是现在有一个间隙,因为顶部面板的高度太高。有没有办法调整面板的大小,使其宽度自动调整到屏幕,但我想调整新面板的高度,使差距更小。顶部的两个文本字段位于具有flowlayout的顶部面板中,下面的3个文本字段位于具有flowlayout的新面板中,是否有方法使3个文本字段位于顶部的

我有一个带有流布局的顶部面板,它有一个文本字段和标签。我需要在第一行下面添加更多的文本字段和标签。我意识到在flowlayout中没有真正的方法来强制一条新线,所以我只是想做一个新的面板,并把它放在最上面的面板下面。问题是现在有一个间隙,因为顶部面板的高度太高。有没有办法调整面板的大小,使其宽度自动调整到屏幕,但我想调整新面板的高度,使差距更小。顶部的两个文本字段位于具有flowlayout的顶部面板中,下面的3个文本字段位于具有flowlayout的新面板中,是否有方法使3个文本字段位于顶部的2个文本字段的正下方?此外,整个框架都在网格布局中

frame.setLayout(new GridLayout(0,1));
Static JPanel topPanel = new JPanel(new flowlayout);
Static JPanel searchPanel = new JPanel(new flowlayout);
Static JPanel statusPanel = new JPanel(new gridLayout(2,1));
Static JPanel categoryPanel = new JPanel(new GridLayout(0.2));
Static JPanel btnPanel = new JPanel(new GridLayout(0,3));
frame.pack();
topPanel.add(searchPanel);
JPanel container2 = new JPanel(new BorderLayout()):
container2.add(topPanel, BorderLayout.North);
frame.getContentPane().add(container2);
frame.getContentPane().add(statusPanel);
frame.getContentPane().add(catergoryPanel);
frame.getContentPane().add(btnPanel);

问题出在
JPanel
GridLayout
之间,它可能被添加到容器的
BorderLayout.CENTER
中,因此它延伸到整个可用空间。它也有相同的单元格大小。将网格包装到
BorderLayout
中,然后将其添加到
BorderLayout.NORTH
中,或者对面板使用
gridbagloayout


下面的示例演示了如何在示例中布置配电盘,以及如何在其他布局中布置配电盘。我认为这将清楚地说明为什么您的
GridLayout
会有这种行为

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;

import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Example {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Example();
            }
        });
    }

    public Example() {

        // GridLayout

        JPanel container1 = new JPanel(new GridLayout(2, 1));
        container1.add(createExamplePanel());
        container1.add(createExamplePanel());

        // GridLayout inside BorderLayut (NORTH)

        JPanel panel = new JPanel(new GridLayout(2, 1, 0, 5 /* margin */)); // You could also use other layouts here, e.g. a BoxLayout
        panel.add(createExamplePanel());
        panel.add(createExamplePanel());
        JPanel container2 = new JPanel(new BorderLayout());
        container2.add(panel, BorderLayout.NORTH);

        // GridBagLayout

        JPanel container3 = new JPanel(new GridBagLayout());
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.anchor = GridBagConstraints.PAGE_START;
        constraints.fill = GridBagConstraints.HORIZONTAL;
        constraints.insets = new Insets(0, 0, 5 /* margin */, 0);
        constraints.weightx = 1.0;
        container3.add(createExamplePanel(), constraints);
        constraints.gridy = 1;
        constraints.weighty = 1.0;
        constraints.insets = new Insets(0, 0, 0, 0);
        container3.add(createExamplePanel(), constraints);

        JPanel contentPane = new JPanel(new GridLayout(1, 3, 5, 5));
        contentPane.add(createTitledPanel(container1, "GridLayout"));
        contentPane.add(createTitledPanel(container2, "GridLayout inside BorderLayout (NORTH)"));
        contentPane.add(createTitledPanel(container3, "GridBagLayout"));

        JFrame frame = new JFrame("Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(contentPane);
        frame.setSize(800, 600);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createTitledPanel(JComponent content, String title) {
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(content);
        panel.setBorder(BorderFactory.createTitledBorder(title));
        return panel;
    }

    private JPanel createExamplePanel() {
        JPanel panel = new JPanel();
        panel.add(new JLabel("Panel"));
        panel.setBorder(BorderFactory.createLineBorder(Color.GRAY));
        return panel;
    }

}

问题出在
JPanel
GridLayout
之间,它可能被添加到容器的
BorderLayout.CENTER
中,因此它延伸到整个可用空间。它也有相同的单元格大小。将网格包装到
BorderLayout
中,然后将其添加到
BorderLayout.NORTH
中,或者对面板使用
gridbagloayout


下面的示例演示了如何在示例中布置配电盘,以及如何在其他布局中布置配电盘。我认为这将清楚地说明为什么您的
GridLayout
会有这种行为

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;

import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Example {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Example();
            }
        });
    }

    public Example() {

        // GridLayout

        JPanel container1 = new JPanel(new GridLayout(2, 1));
        container1.add(createExamplePanel());
        container1.add(createExamplePanel());

        // GridLayout inside BorderLayut (NORTH)

        JPanel panel = new JPanel(new GridLayout(2, 1, 0, 5 /* margin */)); // You could also use other layouts here, e.g. a BoxLayout
        panel.add(createExamplePanel());
        panel.add(createExamplePanel());
        JPanel container2 = new JPanel(new BorderLayout());
        container2.add(panel, BorderLayout.NORTH);

        // GridBagLayout

        JPanel container3 = new JPanel(new GridBagLayout());
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.anchor = GridBagConstraints.PAGE_START;
        constraints.fill = GridBagConstraints.HORIZONTAL;
        constraints.insets = new Insets(0, 0, 5 /* margin */, 0);
        constraints.weightx = 1.0;
        container3.add(createExamplePanel(), constraints);
        constraints.gridy = 1;
        constraints.weighty = 1.0;
        constraints.insets = new Insets(0, 0, 0, 0);
        container3.add(createExamplePanel(), constraints);

        JPanel contentPane = new JPanel(new GridLayout(1, 3, 5, 5));
        contentPane.add(createTitledPanel(container1, "GridLayout"));
        contentPane.add(createTitledPanel(container2, "GridLayout inside BorderLayout (NORTH)"));
        contentPane.add(createTitledPanel(container3, "GridBagLayout"));

        JFrame frame = new JFrame("Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(contentPane);
        frame.setSize(800, 600);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createTitledPanel(JComponent content, String title) {
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(content);
        panel.setBorder(BorderFactory.createTitledBorder(title));
        return panel;
    }

    private JPanel createExamplePanel() {
        JPanel panel = new JPanel();
        panel.add(new JLabel("Panel"));
        panel.setBorder(BorderFactory.createLineBorder(Color.GRAY));
        return panel;
    }

}

“有什么建议吗?”1)2)要更快地获得更好的帮助,请发布或。3) 以最小尺寸提供ASCII艺术或GUI预期布局的简单绘图,如果可以调整大小,则具有更大的宽度和高度。我使用pack,并添加了一张图片以更好地理解。谢谢“我在用背包,…”这个框架最大化了吗?顺便说一句-我的评论中详述的ASCII艺术/图纸在哪里?@B.minnick也许您想直观地向我们展示您希望拥有的组件的布局。“有什么建议吗?”1)2)为了更快地获得更好的帮助,请发布或。3) 以最小尺寸提供ASCII艺术或GUI预期布局的简单绘图,如果可以调整大小,则具有更大的宽度和高度。我使用pack,并添加了一张图片以更好地理解。谢谢“我在用背包,…”这个框架最大化了吗?顺便说一句-我的评论中详细说明的ASCII艺术/图纸在哪里?@B.minnick也许您想直观地告诉我们您希望拥有的组件的排列方式。感谢您的详细回复!有一个问题,如果我在原来的两个面板下面还有两个面板,我是否应该将底部面板的布局设置为南部?好的,我按照你说的做了,现在文本字段就在第一个文本字段下面,但是它们的底部部分被切断了。下面是我所做的:topPanel.add(searchPanel);JPanel container2=新的JPanel(新的BorderLayout());容器2.添加(topPanel,BorderLayout.NORTH);然后我将容器添加到框架中。我使用的网格布局为(0,1),如果发生变化?@B.minnick请编辑您的问题并包含可运行的。很遗憾,我无法重现您描述的问题。“我添加了一些代码”您已被建议两次添加一个。不可编译的代码段不是MCVE。帮自己一个忙&实际阅读链接末尾的文档!如果您不理解,请就您不理解的内容向我们提出具体问题。。请注意,此答案是MCVE。感谢您的详细回复!有一个问题,如果我在原来的两个面板下面还有两个面板,我是否应该将底部面板的布局设置为南部?好的,我按照你说的做了,现在文本字段就在第一个文本字段下面,但是它们的底部部分被切断了。下面是我所做的:topPanel.add(searchPanel);JPanel container2=新的JPanel(新的BorderLayout());容器2.添加(topPanel,BorderLayout.NORTH);然后我将容器添加到框架中。我使用的网格布局为(0,1),如果发生变化?@B.minnick请编辑您的问题并包含可运行的。很遗憾,我无法重现您描述的问题。“我添加了一些代码”您已被建议两次添加一个。不可编译的代码段不是MCVE。帮自己一个忙&实际阅读链接末尾的文档!如果您不理解,请就您不理解的内容向我们提出具体问题。。请注意,此答案是MCVE。