我想创建一个具有底部状态行的垂直项目列表,以便在调整大小时,项目与底线之间的空间会增大。使用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
之类的东西,但似乎什么也没做。
我做错了什么?有没有做我想要的论点?
答案 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);
}
});
}
}
答案 1 :(得分:0)
如果在组件上添加push,则它具有不同的semnatic。来自docs:
使组件所在的行和/或列以“weight”增长。可以使用它来代替在列/行约束中使用“grow”关键字。
所以你必须添加push关键字作为行约束。