シーンに ScrollPane があり、それに一連のノードを追加したいと考えています。正確な量は動的でなければなりません。私は Label ノードを使用してコンセプトをテストしており、ScrollPane (現在は VBox) のコンテンツに必要な数のラベルを正常に追加できます。
私の問題は、ノードでいっぱいの ScrollPane をユーザーが正常にスクロールできるようにする方法を考え出すことです。コンテンツはスクロールバーのペースに合わせます。つまり、下にスクロールすると、コンテンツが下に移動します。上にスクロールすると、コンテンツが上にスクロールします。したがって、10 個のラベルがあり、そのうちの 5 つだけが現在表示されている場合、残りの 5 つを見るための本能的なアクションは下にスクロールすることです。残念ながら、これはコンテンツ全体を下に移動するだけで、空のスペースが上部に表示され、より多くのラベルが非表示になります。
サンプルコードが役立つ場合は投稿できますが、私の攻撃計画の要点は次のとおりです。
ScrollPane sp = new ScrollPane();
VBox content = new VBox();
sp.setContent(content);
for (int i = 0; i < 10; i++)
{
Label label = new Label("Label " + i);
content.setPrefHeight(content.getPrefHeight() + label.getPrefHeight());
content.getChildren().add(label);
}
私は VBox を使用しているため、ラベルは (Y 軸で) 互いに積み重ねられています。これが私が望むものです。より多くのラベルが追加されると、ScrollBar は VBox の増加したサイズを反映する必要があります。メソッドを含め、これを機能させるためにいくつかのアプローチを試しましたがScrollPane.setVmax()
、これは問題ありませんが、スクロール方向がコンテンツを間違った方向に移動させるという問題がまだあります。また、それに応じて値を変更しようとしましたがEventHandler
、EventFilter
スクロールがコンテンツを正しい方向に動かさないという問題をまだ解決していません。
答えはとてもシンプルに思えますが、何時間もコードをいじった後でも、私を回避し続けています。
編集:
を使用するというjewelseaの提案は、ListView
私の問題を解決しました。しかし、なぜ a の使用がScrollPane
それほどうまくいかなかったのか、私はまだ興味があります。さらに、実装で奇妙な動作に遭遇しましListView
た。ボタンを使用して手動でビューに新しいものを追加しLabel
ます。新しい を追加すると、ビューがフリーズすることがありLabel
ます。スクロール位置を更新するか、新しく追加されたを表示する前に、数秒間ロックしLabel
ます。Label
これが約 20 ほどのインスタンスがビューによって管理されているためなのか、それとももっと陰湿なことが行われているのかはわかりません。