如何在MigLayout中增加差距

时间:2014-01-25 10:37:54

标签: java swing layout layout-manager miglayout

我想创建一个具有底部状态行的垂直项目列表,以便在调整大小时,项目与底线之间的空间会增大。使用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之类的东西,但似乎什么也没做。

我做错了什么?有没有做我想要的论点?

2 个答案:

答案 0 :(得分: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);
            }
        });
    }
}

Gaps

答案 1 :(得分:0)

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

使组件所在的行和/或列以“weight”增长。可以使用它来代替在列/行约束中使用“grow”关键字。

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