java布局的麻烦

时间:2016-08-19 22:02:48

标签: java swing

我曾经有一个带有2个组件的jframe,每个组件占用了宽度的一半和所有高度: splitscreen1

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

有人知道如何实现这个目标吗?

2 个答案:

答案 0 :(得分:5)

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

主窗格的FlowLayout将保留左窗格和右窗格。

在右侧窗格中有一个BoxLayoutGridLayout来保存顶部和底部窗格。

在下面的示例代码中,它给出了以下输出

enter image description here

我添加了一些边框颜色以便你可以看到它是如何工作的,我添加了一些标签,因为我太懒了,无法覆盖每个getPreferredSize()的{​​{1}},但我想这会给你关于如何从这里开始的想法。

JPanel

注意:为了在上面的示例中在左右窗格中获得相同的维度,我必须覆盖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); } } 方法,因为我使用了{{ 1}},在这种情况下,为避免这样做,最好在下面的答案中使用@LukkasRotter提供的2条建议中的任何一条。

答案 1 :(得分:5)

使用嵌套布局,即两个网格布局,或使用GridBagLayout

enter image description here

实施例

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;
    }

}