日期:2014-05-20  浏览次数:20757 次

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来计算大小的。