我使用MigLayout有一个非常简单的布局问题。这是一个简短的SSCCE
import java.awt.Color;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;
public class LayoutDemo {
public static void main(final String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel(new MigLayout("insets 0, hidemode 2, debug", "", ""));
final JLabel[] labels = {new JLabel("Area 1"), new JLabel("Area 2"), new JLabel("Area 3")};
for (final JLabel l : labels) {
l.setHorizontalAlignment(JLabel.CENTER);
l.setBackground(new Color(new Random().nextInt(Integer.MAX_VALUE)));
l.setOpaque(true);
}
panel.add(labels[0], "w 200!");
panel.add(labels[1], "spany 2, push, grow, wrap");
panel.add(labels[2], "w 200!, grow, pushy");
frame.setContentPane(panel);
frame.setSize(600, 400);
frame.setVisible(true);
}
}
产生以下输出:
Area 1 的单元格使用与 Area 3 相同的垂直空间。但我希望 Area 3 尽可能地将 Area 1 推开。我怎样才能做到这一点?唯一固定的长度是左侧两个标签的宽度。
答案 0 :(得分:1)
可能不是最佳用途,但如果您使用Eclipse IDE,我强烈建议您使用窗口构建器插件。
http://www.eclipse.org/windowbuilder/
您可以轻松修改Mig布局(或任何类型的布局)以完全满足您的要求。
答案 1 :(得分:1)
在MigLayout构造函数中指定行约束。
JPanel panel = new JPanel(new MigLayout("insets 0, hidemode 2, debug", "[][]", "[][grow,fill]"));
答案 2 :(得分:1)
我将解释为什么你的代码没有做到你 已经预料到并提供一个简单的修正。
标签区域1和区域2共享同一行。 push
标签的约束区域2扩展当前行
和专栏。由于这两个标签共用同一排,
它还影响标签区域1.更改push
标签区域2到pushx
的约束修复了它。
标签区域3由其自身垂直推动
pushy
约束,因此标记区域1和
区域2具有相同的高度。
以下代码示例创建了预期的布局:
package com.zetcode;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import net.miginfocom.swing.MigLayout;
public class MigLayoutPushEx extends JFrame {
public MigLayoutPushEx() {
initUI();
setTitle("Gaps");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
private void initUI() {
setLayout(new MigLayout("insets 5"));
final JLabel[] labels = {new JLabel("Area 1"),
new JLabel("Area 2"), new JLabel("Area 3")};
for (final JLabel l : labels) {
l.setHorizontalAlignment(JLabel.CENTER);
l.setBorder(BorderFactory.createEtchedBorder());
}
add(labels[0], "w 200");
add(labels[1], "w 200, h 200, spany 2, pushx, grow, wrap");
add(labels[2], "w 200, grow, pushy");
pack();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MigLayoutPushEx ex = new MigLayoutPushEx();
ex.setVisible(true);
}
});
}
}