3

ビューポートがJScrollPaneのサブクラスである がありJPanelます。このパネルは でレイアウトされてBoxLayoutおり、ユーザーの操作により、コンポーネントの水平幅が変更される場合があります。スクロール バーが必要なほど十分な数のコンポーネントがある場合、コンポーネントの水平サイズを変更してからサブクラス (ビューポート ビュー) を呼び出すとrevalidate()JPanel常にスクロール ペインが (0,0) にリセットされます。

現在のビューを保持したいので、コンポーネント リスナーを設定しcomponentMoved()、値を格納しますgetLocation()(これはすべて JPanel サブクラスまたはビューポート ビューにあります)。revalidate()呼び出した直後にsetLocation()、保存された場所を使用して呼び出します (イベント ディスパッチ スレッド上)。ただし、ビューの位置が (0,0) に設定されていると、すぐに保存された場所にジャンプします。JScrollPane(0,0) に戻るのを止める方法はありますか? ビューポート ビューのサイズが変更されたことを伝えるより良い方法はありますか?

をサブクラス化し、オーバーライドしてブレークポイントを配置することで、(0,0)がどこから来ているかを把握しようとしましたが、そこにはヒットしていません (ただし、スクロール ホイールを動かしたときです)。何が起こっているのか知っている人はいますか?JScrollBarsetValue()

4

1 に答える 1

3

revalidate()buf beforeの後にコードを呼び出す別の方法を試してくださいrepaint()

scrollPane.getViewport().setViewPosition(new Point(x,y));

または、電話をかけることもできますpanel.scrollRectToVisible(Rectangle)

于 2013-08-09T09:20:48.953 に答える