在JavaSwing中使用MigLayout

在JavaSwing中使用MigLayout,java,swing,layout-manager,gridbaglayout,miglayout,Java,Swing,Layout Manager,Gridbaglayout,Miglayout,我很好奇在放置组件时如何使用MigLayout在网格上均匀分布组件: 例如,如果我将四个JradioButton放置在一个ButtonGroup中,以跨越3行2列(2,3),然后放置三个JButton,则分布的权重是不相等的,我最终会得到以下结果: 如图所示,A和B的大小相同,C保留剩余的空间:我希望A、B、C在垂直方向上相等 如果这在GridBagLayout中是可能的,我也可以利用它,但是我在这两种布局中都遇到了相同的问题 下面是一个试图在应用程序中进一步实现这一点的示例 (我更希望所有按

我很好奇在放置组件时如何使用MigLayout在网格上均匀分布组件:

例如,如果我将四个JradioButton放置在一个ButtonGroup中,以跨越3行2列(2,3),然后放置三个JButton,则分布的权重是不相等的,我最终会得到以下结果:

如图所示,A和B的大小相同,C保留剩余的空间:我希望A、B、C在垂直方向上相等

如果这在GridBagLayout中是可能的,我也可以利用它,但是我在这两种布局中都遇到了相同的问题

下面是一个试图在应用程序中进一步实现这一点的示例

(我更希望所有按钮都不考虑按钮组、小数点和等于相同的大小)

非常感谢

编辑:(感谢Andrew的修复)以下是使用MigLayout添加按钮的示例代码:

    bp.add(buttonGroup1, "grow, span 2 3");
    bp.add(btnQuot );
    bp.add(btnMod);
    bp.add(btnA);
    bp.add(emptyBtn1, "grow");
    bp.add(emptyBtn2, "grow");
    bp.add(emptyBtn3, "grow");
    bp.add(emptyBtn4, "grow");
    bp.add(emptyBtn5, "grow, wrap");
    bp.add(emptyBtn6, "grow");
    bp.add(emptyBtn7, "grow");
    bp.add(btnB, "grow");
    bp.add(btnBackSpace);
    bp.add(btnClrEntr);
    bp.add(btnClear);
    bp.add(btnPlMns);
    bp.add(btnSqrt, "grow,wrap");
    bp.add(emptyBtn8, "grow");
    bp.add(emptyBtn9, "grow");
    bp.add(btnC, "grow");
    bp.add(btn7, "grow");
    bp.add(btn8, "grow");
    bp.add(btn9, "grow");
    bp.add(btnDiv, "grow");
    bp.add(btnPerc, "grow, wrap");
    bp.add(buttonGroup2, "span 2 3");
    bp.add(emptyBtn10, "grow");
    bp.add(emptyBtn11, "grow");
    bp.add(btnD, "grow");
    bp.add(btn4, "grow");
    bp.add(btn5, "grow");
    bp.add(btn6);
    bp.add(btnMult, "grow");
    bp.add(btnOneOverX, "wrap");
    bp.add(emptyBtn12, "grow");
    bp.add(emptyBtn13, "grow");
    bp.add(btnE, "grow");
    bp.add(btn1, "grow");
    bp.add(btn2, "grow");
    bp.add(btn3);
    bp.add(btnSub, "grow");
    bp.add(btnEquals, "grow,wrap, span 1 2");
    bp.add(emptyBtn14, "grow");
    bp.add(emptyBtn15, "grow");
    bp.add(btnF, "grow");
    bp.add(btn0, "grow, span 2");
    bp.add(btnDecimal, "grow");
    bp.add(btnPlus, "grow");

问题很可能是试图将按钮组表示为2x3单元格,因此我将在下一步可能时尝试使用多个面板。

您可以使用MigLayout执行此操作。查看上的部分。也不要害怕使用多个JPanel

下面是一个简单的示例,说明您正在尝试执行的操作:

public class MigSample
{   
    public static void main (String [] args)
    {
        JFrame frame = new JFrame();

        // create radio buttons
        JRadioButton radio1 = new JRadioButton("1");
        JRadioButton radio2 = new JRadioButton("2");
        JRadioButton radio3 = new JRadioButton("3");
        JRadioButton radio4 = new JRadioButton("4");

        // create buttons
        JButton buttonA = new JButton("A");
        JButton buttonB = new JButton("B");
        JButton buttonC = new JButton("C");
        JButton buttonD = new JButton("D");
        JButton buttonE = new JButton("=");

        // create the panel that contains the radio buttons
        JPanel radioPanel = new JPanel(new MigLayout("wrap 1")); // wrap 1 let's us avoid adding the wrap constraing to every component
        radioPanel.add(radio1);
        radioPanel.add(radio2);
        radioPanel.add(radio3);
        radioPanel.add(radio4);

        // create the panel that contains the other buttons
        JPanel buttonPanel = new JPanel(new MigLayout("filly, wrap 2")); // filly tells it to take up all the vertical space
        // add growy to all components so they will fit the cell height
        buttonPanel.add(buttonA, "growy");
        buttonPanel.add(buttonD, "growy");
        buttonPanel.add(buttonB, "growy");
        buttonPanel.add(buttonE, "span 1 2, growy"); // span 1 2 tells this component to span 1 column and 2 rows
        buttonPanel.add(buttonC, "growy");

        // create the main contentPane
        JPanel contentPane = new JPanel(new MigLayout("filly")); // again, we want to fill the vertical space so the 2 panels will have the same height
        contentPane.add(radioPanel);
        contentPane.add(buttonPanel, "growy");

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

提供你们的代码,不要使用图片的链接,在你们的问题中包括你们需要的所有内容,用单独的布局制作两个面板。例如,您可以对单选按钮组使用
GridLayout
,对按钮面板使用
MigLayout
GridBagLayout
,并使用
BorderLayout
将所有功能组合在一起。@Sergiymedvynsky这似乎是一个更好的实现,我假设如果不使用按钮组,JButtons将更加一致,将在实施时更新。谢谢@Amber。刚刚测试了代码,它就可以工作了,我会尽快在我的项目中实现它。在参考白皮书/快速入门指南后,我对MigLayout中的行/列约束感到困惑。我还试图避免使用多个面板,因为我认为MigLayout不太可能需要嵌套面板。此外,我提到了javadoc/quickstart,似乎SizeGroup用于处理保持组件大小相同的问题,但我不确定如何实现它。大小组是一个好主意,尤其是当您有不同长度的文本按钮时。i、 类似这样的东西会使按钮的宽度相同,而没有它,按钮的大小会不同:contentPane.add(newjbutton(“hi”),“sg1”);添加(新的JButton(“hello”),“sg1”);我明白了,所以在添加每个组件时,您可以将组件添加到一个大小组中,我假设您可以对按钮高度执行相同的操作(即,用另一种方式解决我的问题?)此外,我还从他的github中提取了Mikael Grev的演示并编译了它:这在学习中似乎非常有用。无论如何,这帮了我很大的忙。谢谢你,现在我只需要把事情处理好!