JViewport のサブクラスを使用して、カスタム スクロール ビューの問題をデバッグしていました。カスタム LayoutManager の layoutContainer() メソッドからいくつかの情報を出力していましたが、サイズ変更をトリガーすることなく、継続的に呼び出されていることがわかりました。ソースを調べたところ、呼び出しごとに JViewport.setViewPosition() が再検証されているように見えました。ありえないと思いました。そこで、標準の JScrollPane を使用して別のプロジェクトに戻り、次のコードを追加しました。
myScrollPane.setLayout(new ScrollPaneLayout() {
@Override
public void layoutContainer(Container parent) {
System.out.println("Layout ScrollPane");
super.layoutContainer(parent);
}
});
これにより、標準バージョンにも同じ問題があることが証明されました。これを回避する堅牢で受け入れられている方法はありますか? JViewport サブクラスのいくつかのインスタンスを使用して、JViewport.setViewPosition() を使用してリアルタイムでスクロールする波形やその他のものを表示し、10 ミリ秒ごとに (毎回まったく同じように) コンテナーを配置するのは非常に非効率的です。JViewport をサブクラス化してこれをオーバーライドすることはできますが、ビューの位置を変更するためだけに再検証が必要であると考えられた理由を理解することで、新たな問題の発生を回避することができます。現在、なぜこれが必要なのか、私は困惑しています。
したがって、当然の疑問は、「JViewport.setViewPosition()」が再検証を引き起こすのはなぜですか? ということです。