Java Swing 的问题
首先,不知道我这个问题是不是很幼稚。
其次,不要说Swing快被淘汰了,巴拉巴拉巴拉。。。
最后,看问题。
Swing JTable 中可以添加元素,然后我想获得JTable的推荐大小,比如说,一行20,三行就会得到60。注意这个问题不是说的行高。不知道有没有API支持这个操作,如果没有API的话,我想知道JScrollPane是怎么判断其推荐高度的。
而且。。。自己算高度这个我也知道。。。
------解决方案--------------------先看看JTable的getPreferredSize是哪里来的。
JTable的继承关系如下:JTable>JComponent>Container>Component
好的,那么getPreferredSize在JTable中没有重写的,我们看看父类JComponent,
意外发现下面代码:
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
Dimension size = null;
if (ui != null) {
size = ui.getPreferredSize(this);
}
return (size != null) ? size : super.getPreferredSize();
}
先看看这几行代码:
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
if是否通过呢,isPreferredSizeSet是Component中的代码,可以发现它仅在你调用setPreferredSize的时候,而且传入一个非空的Dimension才会被设置为true。
OK。如果你没有设置这个值,那么,应该是继续往下看。
ui.getPreferredSize(this);
那这个UI指的是什么呢?
在JTable的构造方法中,我们有意外发现它调用了一个updateUI的方法。
updateUI();
那updateUI方法中,到底有什么秘密呢?我们可以看到这一行代码:
setUI((TableUI)UIManager.getUI(this));
他是从UIManager中取了一个TableUI。而UIManager中是通过组件的UIClassID和类加载器,从LookAndFeel来获取UI的。
上面所有,通俗的说就是,当你没有调用JTable的setPreferredSize时,它是通过TableUI来计算大小的。