Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.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布局的问题_Java_Swing - Fatal编程技术网

java布局的问题

java布局的问题,java,swing,Java,Swing,我曾经有一个jframe,里面有两个组件,每个组件占据一半的宽度和所有的高度: 我用一个2列1行的gridlayout实现了这一点,效果很好。虽然现在我想在右边的下面添加第三个组件: 有人知道我是如何做到这一点的吗?您可以尝试嵌套一些JPanels,例如: 有一个带有FlowLayout的主窗格,可以容纳左右窗格 在右侧窗格上,有一个BoxLayout或GridLayout来容纳顶部和底部窗格 下面的示例代码给出了以下输出 我添加了一些边框颜色,以便您可以看到它是如何工作的,我添加了一些标

我曾经有一个jframe,里面有两个组件,每个组件占据一半的宽度和所有的高度:

我用一个2列1行的gridlayout实现了这一点,效果很好。虽然现在我想在右边的下面添加第三个组件:


有人知道我是如何做到这一点的吗?

您可以尝试嵌套一些
JPanel
s,例如:

有一个带有
FlowLayout
的主窗格,可以容纳左右窗格

在右侧窗格上,有一个
BoxLayout
GridLayout
来容纳顶部和底部窗格

下面的示例代码给出了以下输出

我添加了一些边框颜色,以便您可以看到它是如何工作的,我添加了一些标签,因为我太懒了,无法覆盖每个
JPanel
getPreferredSize()
,但我想这会让您了解如何从这里开始

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;

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

public class LayoutExample {
    private JFrame frame;
    private JPanel pane;
    private JPanel leftPane;
    private JPanel rightPane;
    private JPanel topPane;
    private JPanel bottomPane;
    public static void main (String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new LayoutExample().createAndShowGui();
            }
        });
    }

    public void createAndShowGui() {
        frame = new JFrame("Layout Example");
        pane = new JPanel();
        leftPane = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 300); 
            }
        };
        rightPane = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 300);
            }
        };
        topPane = new JPanel();
        bottomPane = new JPanel();

        pane.setLayout(new FlowLayout());
        rightPane.setLayout(new GridLayout(2, 1, 5, 5));

        rightPane.add(topPane);
        rightPane.add(bottomPane);

        pane.add(leftPane);
        pane.add(rightPane);
        pane.setBorder(BorderFactory.createLineBorder(Color.green));
        leftPane.setBorder(BorderFactory.createLineBorder(Color.red));
        topPane.setBorder(BorderFactory.createLineBorder(Color.black));
        bottomPane.setBorder(BorderFactory.createLineBorder(Color.magenta));

        frame.setContentPane(pane);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}


注意:在上面的示例中,为了在左窗格和右窗格上获得相同的维度,我必须重写
getPreferredSize()
方法,这是因为我使用了
FlowLayout
,在这种情况下,为了避免这样做,最好使用@Lukkasorter在下面的回答中给出的两个建议中的任何一个。

要么使用嵌套布局,即两个网格布局,要么使用

实例
你能告诉我们你已经做了什么,以及你尝试做了什么来添加第三个窗格吗?要么使用嵌套布局,即两个网格布局,要么使用
GridBagLayout
。是的,我只是很笨,我只是尝试了嵌套布局,它们工作得很好。无论如何,谢谢,如果有人想发布一个答案,我会把它标记为正确的。之前我只是有一个2列的网格布局。我试着只做第二排,但我不想这样做,但嵌套的网格布局效果很好。“每一排都占一半的宽度和所有的高度:“-这个要求如何适合你的例子?”?它只是占用了计算出的首选大小。@LukasRotter我刚刚发布了一个代码示例,它可以同时包含两个窗格,一个在左侧的窗格和一个在右侧包含两个以上窗格的窗格,我没有考虑到这一点,但是感谢您的评论,我稍后将尝试修复该部分,我刚吃过午饭回来,看到这个问题,我决定在不超过5分钟内回答,但是你的答案比我的好,这就是为什么在你发表评论之前我把它投了赞成票。这只是我在记事本上写下的一个模糊的想法,甚至连一张纸都没有IDE@Frakcool啊,我明白了,这也解释了为什么你导入了整个awt和swing软件包:P一旦你修复了讨论的部分,我会更新投票。@LukasRotter是的,谢谢,我稍后会做,然后在评论中给你贴上标签:)@LukasRotter我很抱歉更新太晚,我在工作和学校都很忙,今天我终于能够更新这个答案了,我希望现在更好
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;

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

public class Example {

    public static void main(String[] args) {
        new Example().createAndShowGUI();
    }

    public void createAndShowGUI() {
        JPanel nestedPanel = new JPanel(new GridLayout(2, 1, 10, 10));
        nestedPanel.add(createBorderedPanel());
        nestedPanel.add(createBorderedPanel());

        JPanel nestedPanelContainer = new JPanel(new GridLayout(1, 2, 10, 10));
        nestedPanelContainer.setBorder(BorderFactory.createTitledBorder("Nested GridLayouts"));
        nestedPanelContainer.add(createBorderedPanel());
        nestedPanelContainer.add(nestedPanel);

        JPanel gridBagPanel = new JPanel(new GridBagLayout());
        gridBagPanel.setBorder(BorderFactory.createTitledBorder("GridBagLayout"));
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.fill = GridBagConstraints.BOTH;
        constraints.weightx = 1;
        constraints.weighty = 1;
        constraints.gridheight = 2;
        constraints.insets = new Insets(5, 5, 5, 5);
        gridBagPanel.add(createBorderedPanel(), constraints);
        constraints.gridheight = 1;
        constraints.gridx = 1;
        gridBagPanel.add(createBorderedPanel(), constraints);
        constraints.gridy = 1;
        gridBagPanel.add(createBorderedPanel(), constraints);

        JPanel contentPane = new JPanel(new GridLayout(1, 2, 5, 5));
        contentPane.add(nestedPanelContainer);
        contentPane.add(gridBagPanel);

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

    private JPanel createBorderedPanel() {
        JPanel panel = new JPanel();
        panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        return panel;
    }

}