2011-01-13 11 views
1

私はJScrollPaneを使用しており、viewportView.doLayoutの中にはviewportView.setPreferredSizeがあります。 JScrollPaneのスクロールバーは、最後にsetPreferredSizeに従って更新されるため、doLayoutの前には間違っているようです。したがって、再検証の場合、JScrollPaneは最初にスクロールバーを適切なサイズに更新してからdoLayoutを呼び出しているようです。JavaとJScrollPane:setPreferredSizeをどこから呼び出しますか?

この動作を変更できますか?またはsetPreferredSizeはどこに電話する必要がありますか?または、子コンポーネントをレイアウトするコードはどこに置くべきですか? viewportView.doLayout内部の両方this.setPreferredSizethis.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(); 
    } 
} 

これは現在正常に動作するようです。

誰かがこれが適切な方法であるかどうかを明確にすることができるかどうか、さらに疑問に思う。

+0

私はあまりよく分かりませんが、setSizeを呼び出すafaikはdoLayoutメソッドの内部で行うべきことです。さらにスクロールバーはコンポーネントの実際のサイズを反映しています。 – tigger

+0

これは、ホイールを再発明しようとするときに発生する問題の1つです。 doLayout()をオーバーライドする必要はありません。 Swingのデザイナーは、レイアウト管理の仕組みについて大いに考えていたと思いませんか? Albertは、昨日の他の投稿(http://stackoverflow.com/questions/4670433/java-awt-swing-about-validation-and-sizes)では、これらすべてのメソッドをオーバーライドするのではなくカスタムレイアウトマネージャを使用するようアドバイスされました。 – camickr

+0

@camickr:「これらすべての方法」の意味を説明できますか?私はちょうど1つのメソッドをオーバーライドし、ちょうどそこにいくつかの非常に簡単なコードを置いています。 – Albert

答えて

0

JScrollPaneのコンテンツ(例:JPanel)のサイズをコンテンツに設定する場合は、 JScrollPaneのサイズをJScrollPaneに設定したい場合。 viewPortViewのメソッドを呼び出す必要はありません。

+0

しかし、私のviewportViewは私のコンテンツです。そして、問題は私が何を呼ぶべきものではなく、どこで*私が電話をしなければならないかということでした。 – Albert

関連する問題