java - Miglayout 中不跨越拆分单元格的组件

标签 java miglayout

我已阅读 Miglayout 快速入门指南和白皮书。我正在尝试布置对话框,以便所有复选框都在两列中对齐,即使它们有时由单选按钮分隔。

我希望文本字段和分隔符跨越对话框的宽度,同时仍然位于其标签旁边。文本区域也应该独占一行。我尝试拆分第一列并实现适当的间距,但是,即使使用关键字,组件也不会“跨越”到下一列。

我认为这应该是可能的,因为快速入门指南说,

"It is of course possible to both span and split cells at the same time."

(第 2 页)

完整的代码示例如下。

public static void main(String[] args) 
{
    JFrame frame = new JFrame("Snack Selection");

    JTextField d_msrField = new JTextField("Jane Doe");
    d_msrField.setEnabled(false);
    d_msrField.setColumns(30);

    JPanel panel = new JPanel(new MigLayout("debug, wrap 2", "[]15[]"));

    panel.add(new JLabel("Name:"), "gapbottom 11, gaptop 11, split 2");
    panel.add(d_msrField, "span 2");

    panel.add(new JRadioButton("Choose a Fruit"), "wrap");
    panel.add(new JCheckBox("Apple"), "gapleft 18");
    panel.add(new JCheckBox("Orange"));
    panel.add(new JCheckBox("Pear"), "gapleft 18");
    panel.add(new JCheckBox("Banana"));
    panel.add(new JRadioButton("Choose a Vegetable"), "wrap");
    panel.add(new JCheckBox("Celery"), "gapleft 18");
    panel.add(new JCheckBox("Carrot"));
    panel.add(new JRadioButton("Choose a Dairy Item"), "wrap");
    panel.add(new JCheckBox("Milk"), "gapleft 18");
    panel.add(new JCheckBox("Cheese"));

    panel.add(new JLabel("Options"), "split 2");
    panel.add(new JSeparator(), "span 2, growx");

    JTextArea ta = new JTextArea(5, 30);
    JScrollPane opts = new JScrollPane(ta);
    panel.add(opts, "gapleft 18");

    frame.setLayout(new BorderLayout());
    frame.add(panel, BorderLayout.CENTER);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}

dialog image

编辑:为了解决这个问题,我在开头添加了一个额外的列和“wrap 3”,但我仍然很好奇是否有人知道为什么原始代码不起作用。

fixed dialog

最佳答案

我很高兴您使用 wrap 3 对它进行排序,但我认为您的主要问题是如何使用 split, span

例如,如果您查看向面板添加内容的第一行

panel.add(new JLabel("Name:"), "gapbottom 11, gaptop 11, split 2");
panel.add(d_msrField, "span 2");

在这里,您分割第一个单元格(这实际上使该单元格成为网格内的子行),然后在添加d_msrField时尝试span。存在的问题是 d_msrField 已经是此子行中的最后一个单元格,因此 span 不会执行任何操作。

您实际需要做的是跨越子行

panel.add(new JLabel("Name:"), "gapbottom 11, gaptop 11, split, span");

您在使用 JSeparator 时也遇到同样的问题。

如果您应用这种拆分原则,然后跨越第一个单元格,您所拥有的将按预期工作。

enter image description here

<小时/>

可运行示例

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import net.miginfocom.swing.MigLayout;

public class Test {
    public static void main(String[] args) 
    {
        JFrame frame = new JFrame("Snack Selection");

        JTextField d_msrField = new JTextField("Jane Doe");
        d_msrField.setEnabled(false);
        d_msrField.setColumns(30);

        JPanel panel = new JPanel(new MigLayout("wrap 2", "[]15[grow]"));

        panel.add(new JLabel("Name:"), "gapbottom 11, gaptop 11, split, span");
        panel.add(d_msrField, "wrap");

        panel.add(new JRadioButton("Choose a Fruit"), "wrap, span");
        panel.add(new JCheckBox("Apple"), "gapleft 18");
        panel.add(new JCheckBox("Orange"));
        panel.add(new JCheckBox("Pear"), "gapleft 18");
        panel.add(new JCheckBox("Banana"));
        panel.add(new JRadioButton("Choose a Vegetable"), "span, wrap");
        panel.add(new JCheckBox("Celery"), "gapleft 18");
        panel.add(new JCheckBox("Carrot"));
        panel.add(new JRadioButton("Choose a Dairy Item"), "span, wrap");
        panel.add(new JCheckBox("Milk"), "gapleft 18");
        panel.add(new JCheckBox("Cheese"));

        panel.add(new JLabel("Options"), "split, span");
        panel.add(new JSeparator(), "gaptop 4, growx, wrap");

        JTextArea ta = new JTextArea(5, 30);
        JScrollPane opts = new JScrollPane(ta);
        panel.add(opts, "gapleft 18, span, growx");

        frame.add(panel);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}
<小时/>

子行可能是正确的术语,也可能不是正确的术语,但它是我为了尝试帮助回答问题而编造的描述性术语

关于java - Miglayout 中不跨越拆分单元格的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46474774/

相关文章:

java - Spring Boot/JPA - 数据行级授权

java - 尝试从数组中获取随机元素,以便我可以将其标记为 "booked"

java - 具有 miglayout 和嵌套面板的 Swing 布局

java - 使用java api获取ec2中可用实例的数量

java - Constraints-Mappings 文件中的 Hibernate Validator 类级约束

java - 从 SD 卡加载绘图

java - MIG 布局未显示正确的格式

java - MigLayout - 使用多个约束

java - 具有 native 外观和感觉的 Miglayout 具有不同的行为