我目前正在制作一个使用 FlowLayout 类的 GUI。现在,这个类旨在允许组件通过其首选大小的方法进行设置,我相信,不应该优先设置组件大小。但是,当我对 JTextField 使用 setSize 方法时,FlowLayout 对象似乎无法识别更改大小命令。但是当我使用 setColumn 方法时,FlowLayout 对象确实响应了大小命令的更改。
这是为什么呢?
FlowLayout 对象似乎无法识别更改大小命令。 但是当我使用 setColumn 方法时,FlowLayout 对象确实 响应大小更改命令。这是为什么呢?
形成您自己的问题,我知道您知道FlowLayout
遵循组件的首选尺寸工作。然而,要回答你的问题,为什么真的JTextFeild.setColumn(int)
回答:因为,
一旦调用setColumn(int)
,它就会使 JTextFeild
组件及其上面的所有父组件失效,以标记为需要布局。
public void setColumns(int columns) {
int oldVal = this.columns;
if (columns < 0) {
throw new IllegalArgumentException("columns less than zero.");
}
if (columns != oldVal) {
this.columns = columns;
invalidate(); // invalidate if column changes
}
}
然后在布局时,FlowLayout 调用 JTextFeild 的 getPreferredSize()
函数,该函数被覆盖并实现,以便通过添加列宽返回首选宽度:
public Dimension getPreferredSize() {
Dimension size = super.getPreferredSize();
if (columns != 0) {
Insets insets = getInsets();
size.width = columns * getColumnWidth() +
insets.left + insets.right; // changing the width
}
return size;
}
你猜怎么着!我正在成为源代码的粉丝。