0

在我正在处理的一个 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 中有一个 JTextArea 并且行设置为 3 时,我的问题就来了:

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 行高度。

我是否误解了行约束是如何工作的,或者这里还有其他我完全看不到/理解的东西?

4

1 回答 1

1

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

您可以通过简单地将“调试”添加到布局约束来轻松地可视化您的 MigLayout 行和列结构:

String layoutConstraints = "fill,debug";

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

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

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

但是JTextArea行与容器(在您的情况下为JPanel)布局中的行不对应。

请更仔细地了解(并进行实验!)JTextArea row财产的确切含义。

于 2012-06-12T16:55:35.203 回答