需要帮助理解一些行约束行为

时间:2012-06-12 12:38:42

标签: java swing layout layout-manager miglayout

在我正在研究的Java项目中,我的约束最初设置为:

JPanel panel = new JPanel();
String layoutConstraints = "fill";
String columnConstraints = "[right]rel[grow]";
String rowConstraints = "[]10[]";
panel.setLayout(new MigLayout(layoutConstraints, columnConstraints, rowConstraints));

根据我对文档的理解,对于超出规范的每一行,将重复最后的间隙和约束。 (参见“如果格式字符串中的行数少于该维度中网格单元格中的行数,则最后一个间隙和行约束将用于额外的行。”)

所以我理解,这应该意味着行约束实际上是[]10[]10[]10[]等等。

当我在JScrollPane中有一个行设置为3的JTextArea时出现问题:

JLabel label = new JLabel("Text area");
JTextArea text = new JTextArea("Test", 3, 40);
JScrollPane scroll = new JScrollPane(text);
panel.add(label);
panel.add(scroll, "grow,wrap");

当与[]10[]的行约束一起使用时,只有1行高,但是当我更改

String rowConstraints = "[]10[]";

String rowConstraints = "[]";

它突然使用我为JTextArea指定的完整3行高度。

我是否误解了行限制是如何工作的还是在这里工作的其他东西我完全没有看到/理解?

1 个答案:

答案 0 :(得分:1)

在这两种情况下,您只使用一个布局行(即由MigLayout管理的行)JLabel(第一列)和JScrollPanel(包含JTextArea,第二列)

只需在布局约束中添加“debug”,即可轻松查看MigLayout行和列结构:

String layoutConstraints = "fill,debug";

启动应用程序。我真的建议您在处理布局时使用此设置。

您为JTextArea设置的行属性与布局行无关。此属性仅告知JTextArea组件它将尝试的大小,如javadocs中所定义:

  

java.awt.TextArea有两个属性行和列,用于确定首选大小。放置在JScrollPane(...)中时,JTextArea使用这些属性来指示视口的首选大小

JTextArea行与容器中的行(在您的情况下为JPanel)布局中的任何方式都不对应。

请详细了解(并进行实验!)JTextArea row属性的确切含义。