布局以拉伸组件宽度,但让高度由它所拥有的东西决定

时间:2014-09-25 11:47:57

标签: java user-interface layout-manager miglayout

我似乎无法找到正确的布局管理器,也许它不存在,所以我想在miglayout中做到这一点,但我似乎无法找到我的方法在那里做到这一点任

我发现的大多数文档,教程和示例都没有在JPanel中添加内容0.o

我遇到的问题是,我在JPanel(B)中有两个JPanels(C 1& 2),而JPanel(B)内部则是一个更大的可调整大小的JPanel(A)。 现在都是最低级别" C" JPanels包含5个按钮,当最高级别" A"调整按钮的大小并减小宽度:

enter image description here

到此:

enter image description here

正如您所看到的,我在最低级别使用FlowLayout" C" JPanels正在做它的工作!

c.setLayout(new FlowLayout(FlowLayout.LEFT,0,0))

但是" B"持有C&C的JPanel完全符合我对水平部分的要求

b.setLayout(new BoxLayout(b, BoxLayout.Y_AXIS));

我不希望它在高处做到这一点!

所以有人能指出我正确的方向,就像教程或文档那样涵盖这些东西吗?对于miglayout或swing布局管理器?

1 个答案:

答案 0 :(得分:0)

我已经与MigLayout经理创建了一个解决方案。面板保持他们的 当窗口调整大小并且永远不会缩小到大小以下时,高度很好 需要按住所有按钮。

package com.zetcode;

import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;


public class MigLayoutSolution extends JFrame {

    public MigLayoutSolution() {

        initUI();
    }

    private void initUI() {

        JPanel pnl = new JPanel(new MigLayout());

        pnl.add(createPanel1("First"), "push, grow, wrap"); 
        pnl.add(createPanel2("Second"), "push, grow");

        add(pnl);
        pack();

        setTitle("MigLayout solution");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
    }

    private JPanel createPanel1(String text) {

        JPanel pnl = new JPanel(new MigLayout());
        pnl.add(new JButton("A"));
        pnl.add(new JButton("B"));
        pnl.add(new JButton("C"));
        pnl.add(new JButton("D"));
        pnl.setBorder(BorderFactory.createTitledBorder(text));

        return pnl;
    }    

    private JPanel createPanel2(String text) {

        JPanel pnl = new JPanel(new MigLayout());
        pnl.add(new JButton("E"));
        pnl.add(new JButton("F"));
        pnl.add(new JButton("G"));
        pnl.add(new JButton("H"));
        pnl.setBorder(BorderFactory.createTitledBorder(text));

        return pnl;
    }        

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                MigLayoutSolution ex = new MigLayoutSolution();
                ex.setVisible(true);
            }
        });          
    }
}

第一张照片显示两个面板有足够的空白空间。

MigLayout Solution 1

第二张图显示了最小尺寸的面板。

MigLayout Solution 2