getPreferredSizeについて

相変わらずこの問題をちょこちょこっと調べています。
問題を整理してみると…
JScrollPane.getPreferredSize()が、期待する値を返さない場合があるということです。getPreferredSize()は、そのコンポーネントが表示されるために必要な表示領域の大きさを返します。要するに、「これぐらいの大きさで表示して欲しいな」という値です。ですから、レイアウトマネージャなどは、この値を参考にして、実際の配置や大きさの決定を行います。
さて、ここでJScrollPane.getPreferredSize()は、自身がスクロールして表示する内容の大きさに、スクロールバーが表示される必要があるときは、スクロールバーの大きさを足し、必要がないときは、表示する内容の大きさをそのまま返すことが期待されます。
で、実際の挙動はというと、確かにこのような感じで動作しています。しかし、スクロールバーの表示をAS_NEEDEDにし、内部(例えばJLabel)のgetPreferredSize()の値を小さくし、revalidate()をすると、JScrollPaneが返すgetPreferredSize()の大きさは、スクロールバー込みの値になってしまいます。それがたとえスクロールを表示する必要がなくてもです。
これが起こるとどんな問題が発生するか。スクロールバーの分だけ実際の表示領域が大きくなってしまうので、JLabelが大きくなってしまいます。これが画像を表示している場合、表示領域の周囲に無駄な空間ができてしまうことになります。ちょっと見た目がなさけなくなります。
結局見た目だけの問題ですので、大したことないっちゃあ大したことはないんですけどね。でも、今作ってるアプリケーションに関しては、個人的に気になる問題なので、もう少しだけ解決策を考えてみたいと思います。
一番手っ取り早い解決策は、JScrollPaneを使わない、JScrollBarだけで自力でがんばるJComponentは作ってしまうことなんですけどね…*1

*1:調べるのが面倒だったから、もう作ってしまったよ…orz