GridLayout中的GridBagLayouts

时间:2015-07-05 19:04:34

标签: swing user-interface layout-manager grid-layout gridbaglayout

尝试在Swing中构建此GUI:

enter image description here

在我的MainFrame中,我设置了一个GridLayout来实现1行,2列:

setLayout(new GridLayout(1, 2));

在左栏中,我需要一个GridBagLayout,如右栏所示。普通的GridLayout不再起作用,因为我希望每行的大小不同。对于左栏我尝试了这个:

GridBagConstraints gbc = new GridBagConstraints();

    mapPanel = new MapPanel(map);
    gbc.fill = GridBagConstraints.BOTH;
    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.gridheight = 10;
    add(mapPanel, gbc);

    controlPanel = new JPanel();
    controlPanel.add(new JButton("Test"));
    controlPanel.add(new JButton("Test 2"));
    controlPanel.add(new JButton("Test 3"));
    controlPanel.add(new JButton("Test 4"));
    gbc.fill = GridBagConstraints.BOTH;
    gbc.gridx = 0;
    gbc.gridy = 1;
    gbc.gridheight = 1;
    add(controlPanel, gbc);

    logPanel = new LogPanel();
    gbc.fill = GridBagConstraints.BOTH;
    gbc.gridx = 0;
    gbc.gridy = 2;
    gbc.gridheight = GridBagConstraints.REMAINDER;
    add(logPanel, gbc);

然而,这将导致所有东西被包装在一起"在左栏中。它不会扩展到柱子的100%高度和50%宽度。如何在图片中实现GUI?

谢谢!

3 个答案:

答案 0 :(得分:2)

看看JNodeLayout。 RectNode正是您所需要的。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.geom.Rectangle2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;

import com.smartg.swing.layout.JNodeLayout;
import com.smartg.swing.layout.LayoutNode.RectNode;

public class RectNodeDemo {

    public static void main(String[] args) {

        String rootName = "root";
        RectNode root = new RectNode(rootName);
        JNodeLayout layout = new JNodeLayout(root);
        layout.setHgap(1);
        layout.setVgap(1);


        JPanel target = new JPanel();
        target.setBorder(new EmptyBorder(10, 10, 10, 10));

        target.setLayout(layout);

        addPanel(target, root, new Rectangle2D.Double(0, 0, .5, .5));
        addPanel(target, root, new Rectangle2D.Double(0, .5, .5, .1));
        addPanel(target, root, new Rectangle2D.Double(0, .6, .5, .4));  

        addPanel(target, root, new Rectangle2D.Double(.5, 0, .5, .9));
        addPanel(target, root, new Rectangle2D.Double(.5, .9, .5, .1));

        layout.syncNodes();

        JFrame frame = new JFrame();

        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new BorderLayout());
        contentPane.add(target, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

    static void addPanel(JPanel target, RectNode node, Rectangle2D r) {
        JPanel p = new JPanel();
        target.add(p);
        p.setBorder(new LineBorder(Color.BLACK, 1));
        node.add(p, r);
    }
}

答案 1 :(得分:2)

您可以使用Relative Layout。此布局允许您指定每个组件的相对大小。

要在左侧创建面板,代码将类似于:

RelativeLayout rl = new RelativeLayout(RelativeLayout.Y_AXIS);
rl.setFill( true );
JPanel left = new JPanel( rl );
left.add(panel1, new Float(50));
left.add(panel2, new Float(10));
left.add(panel3, new Float(40));

答案 2 :(得分:0)

仅使用GridBagLayout即可。

通过设置gbc.gridheight = 10,您可以告诉GridBag为组件使用10行。 (类似于HTML中的rowspan。)但是,这并未说明组件的实际高度,因为行没有固定的高度。因此,当您仅使用单个列时,此约束不会产生任何影响。约束的名称是恕我直言,令人困惑。

使用GridBagConstraints.weightxGridBagConstraints.weighty指定额外空间应该去的位置。有关详情,请参阅How to Use GridBagLayout

结合组件的首选尺寸,您将能够获得一个面板,当面板较小时,该面板将显示您的组件,并在面板“太大”时分配额外的空间。

尽管正如Andrew Thompson指出的那样,使用setPreferredSize()并不是一个很好的方法。通常,组件已经具有其构造的优选尺寸。只需使用GridBagConstraints的所有内容,看看会发生什么。

这最终可能是一个更好看的解决方案。