代码之家  ›  专栏  ›  技术社区  ›  lspare

Miglayout中未跨越拆分单元格的组件

  •  1
  • lspare  · 技术社区  · 8 年前

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

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

    “当然,可以同时跨越和拆分单元格。”

    完整的代码示例如下。

    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

    fixed dialog

    1 回复  |  直到 7 年前
        1
  •  0
  •   Dan    7 年前

    wrap 3 split, span .

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

    给你 split 第一个单元格(这实际上使该单元格成为网格中的一个子行),然后尝试 span 当您添加时 d_msrField . 问题是 d_msrField公司 已是此中的最后一个单元格 sub row

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

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

    您对JSepator也有同样的问题。

    如果你应用这个分裂的原则,然后跨越第一个单元格,你所拥有的就会如预期的那样工作。

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

    子行可能是正确的术语,也可能不是正确的术语,但这是一个描述性的术语,我试图帮助回答这个问题