【问题标题】:How to make a gap grow in MigLayout如何在 MigLayout 中扩大差距
【发布时间】:2014-02-16 10:30:08
【问题描述】:

我想创建一个带有底部状态行的垂直项目列表,以便在调整大小时,项目和底线之间的空间会增加。使用MigLayout 这一定很简单,但不知何故并非如此。

下面的代码正是我想要的,但我不得不使用一个组件来做间距:

final JFrame frame = new JFrame();
final JPanel panel = new JPanel(new MigLayout("wrap, debug", "[grow, fill]", ""));
for (int i=0; i<5; ++i) {
    final JEditorPane line = new JEditorPane();
    line.setText("a" + i);
    panel.add(line);
}
panel.add(new JLabel(), "push"); // This should be a gap!
final JLabel status = new JLabel("status line");
panel.add(status, "");
frame.add(panel);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

我想我可以在第三个构造函数参数中指定不断增长的差距,但列表长度是可变的。这也可以全部解决,但我怀疑这是最佳实践。我所希望的,类似于gaptop push,但它似乎什么也没做。

我做错了什么?有没有做我想做的事?

【问题讨论】:

    标签: java swing layout layout-manager miglayout


    【解决方案1】:

    MigLayout 确实是一位非常强大的经理。这可以实现 以多种方式。我提供了三种解决方案。

    解决方案 1

    我们在第 5 行和第 6 行之间设置了一个贪婪的间隙。

    package com.zetcode;
    
    import java.awt.EventQueue;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
    import net.miginfocom.swing.MigLayout;
    
    
    public class MigLayoutGapGrow extends JFrame {
    
        public MigLayoutGapGrow() {
    
            initUI();
    
            setTitle("Gaps");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLocationRelativeTo(null);
        }
    
    
        private void initUI() {
    
    
            setLayout(new MigLayout("wrap", "[grow, fill]", "[][][][][]20:push[]"));
    
            add(new JTextField("a"+1));
            add(new JTextField("a"+2));
            add(new JTextField("a"+3));
            add(new JTextField("a"+4));
            add(new JTextField("a"+5));
    
            final JLabel status = new JLabel("status line");
            add(status);
    
    
            pack();
        }
    
    
        public static void main(String[] args) {
    
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    MigLayoutGapGrow ex = new MigLayoutGapGrow();
                    ex.setVisible(true);
                }
            });
        }
    }
    

    解决方案 2

    我们放大放置标签的最后一个单元格。那么标签就是 与底部对齐。

    package com.zetcode;
    
    import java.awt.EventQueue;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
    import net.miginfocom.swing.MigLayout;
    
    
    public class MigLayoutGapGrow2 extends JFrame {
    
        public MigLayoutGapGrow2() {
    
            initUI();
    
            setTitle("Gaps");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLocationRelativeTo(null);
        }
    
    
        private void initUI() {
    
            setLayout(new MigLayout("wrap, debug", "[grow, fill]"));
    
            add(new JTextField("a"+1));
            add(new JTextField("a"+2));
            add(new JTextField("a"+3));
            add(new JTextField("a"+4));
            add(new JTextField("a"+5));
    
            final JLabel status = new JLabel("status line");
            add(status, "pushy, bottom");
    
            pack();
        }
    
    
        public static void main(String[] args) {
    
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    MigLayoutGapGrow2 ex = new MigLayoutGapGrow2();
                    ex.setVisible(true);
                }
            });
        }
    }
    

    解决方案 3

    标签使用相对定位附加到底部。相对的 定位似乎不适用于pack() 方法,这可能 是个问题。

    package com.zetcode;
    
    import java.awt.EventQueue;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
    import net.miginfocom.swing.MigLayout;
    
    
    public class MigLayoutGapGrow3 extends JFrame {
    
        public MigLayoutGapGrow3() {
    
            initUI();
    
            setTitle("Gaps");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLocationRelativeTo(null);
        }
    
    
        private void initUI() {
    
            setLayout(new MigLayout("wrap", "[grow, fill]"));
    
            add(new JTextField("a"+1), "id a1");
            add(new JTextField("a"+2));
            add(new JTextField("a"+3));
            add(new JTextField("a"+4));
            add(new JTextField("a"+5));
    
            final JLabel status = new JLabel("status line");
            add(status, "pos a1.x visual.y2-p");
    
            pack();
        }
    
    
        public static void main(String[] args) {
    
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    MigLayoutGapGrow3 ex = new MigLayoutGapGrow3();
                    ex.setVisible(true);
                }
            });
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果您在组件上添加 push,它具有不同的语义。来自docs

      使组件所在的行和/或列随着“权重”增长。这可以用来代替列/行约束中的“增长”关键字。

      所以你必须添加 push 关键字作为行约束。

      【讨论】:

        猜你喜欢
        • 2017-03-08
        • 2016-09-30
        • 1970-01-01
        • 2013-04-25
        • 1970-01-01
        • 1970-01-01
        • 2018-09-27
        • 2014-01-13
        • 1970-01-01
        相关资源
        最近更新 更多