私はJScrollPane
を使用しており、viewportView.doLayout
の中にはviewportView.setPreferredSize
があります。 JScrollPane
のスクロールバーは、最後にsetPreferredSize
に従って更新されるため、doLayout
の前には間違っているようです。したがって、再検証の場合、JScrollPane
は最初にスクロールバーを適切なサイズに更新してからdoLayout
を呼び出しているようです。JavaとJScrollPane:setPreferredSizeをどこから呼び出しますか?
この動作を変更できますか?またはsetPreferredSize
はどこに電話する必要がありますか?または、子コンポーネントをレイアウトするコードはどこに置くべきですか? viewportView.doLayout
内部の両方this.setPreferredSize
とthis.setSize
を呼び出す
:
は、私は1つの動作方法を考え出しました。
私は実際になぜそれが働いているのか理解できないので、私はこの質問を開いたままにしています。それは無限ループを生成しているために働いた[OK]を
は、すなわちそれは、常にイベントループの中に、問題を解決し、もちろん、いくつかの再検証要求をプッシュ。しかし、それは実際の解決策ではありません。
は、私は今、これを持っている:
// In viewportView of the JScrollPane:
@Override public void doLayout() {
// ... layout childs ...
// size.x/size.y being the size I want to have for the viewportView
if(size.x != getPreferredSize().width || size.y != getPreferredSize().height) {
setPreferredSize(new Dimension(size.x, size.y));
if(getParent() != null) getParent().validate();
}
}
これは現在正常に動作するようです。
誰かがこれが適切な方法であるかどうかを明確にすることができるかどうか、さらに疑問に思う。
私はあまりよく分かりませんが、setSizeを呼び出すafaikはdoLayoutメソッドの内部で行うべきことです。さらにスクロールバーはコンポーネントの実際のサイズを反映しています。 – tigger
これは、ホイールを再発明しようとするときに発生する問題の1つです。 doLayout()をオーバーライドする必要はありません。 Swingのデザイナーは、レイアウト管理の仕組みについて大いに考えていたと思いませんか? Albertは、昨日の他の投稿(http://stackoverflow.com/questions/4670433/java-awt-swing-about-validation-and-sizes)では、これらすべてのメソッドをオーバーライドするのではなくカスタムレイアウトマネージャを使用するようアドバイスされました。 – camickr
@camickr:「これらすべての方法」の意味を説明できますか?私はちょうど1つのメソッドをオーバーライドし、ちょうどそこにいくつかの非常に簡単なコードを置いています。 – Albert