You know what? I ran my code through the debugger with breakpoints in the appropriate places, and resizing makes no calls to getPreferredSize() at all. It seems to be called just once when the node is added and viewed for the first time. There are no subsequent calls to it, no matter how many times you resize, expand, or collapse. Neither does it trigger any calls to getMinimumSize() or getMaximumSize(). So I guess in answer to your question, it wouldn't help to call either repaint() or revalidate() after computing the size, since the first time works fine. From what I've seen of BasicTreeUI code, I think it implicitly assumes that a scroll bar is available, so I guess it caches the tree dimensions. I hope I'm mistaken...