質問: JavaFXのテキストエリアのスクロールバーでスクロールできる最大量(スクロールできる高さ)を取得したいのですが、どうやって取得するのかわかりません。
回答: 追記:本件の技術的内容とは直接関係ない追記をお許しください。 URONさん、本質問を日本語版stackoverflowにマルチポストされているようですね。 stackoverflow: JavaFXのテキストエリアの縦スクロールできる最大量を取得したい stackoverflow側にマルチポストの指摘がついたまま放置状態です。この状態はマナー的に非常によくありません。おそらくはそのこと自体をご存知ないのだろうと思います。 * teratail ヘルプ: 他のサービスにも質問投稿をしたい(してしまった) * スタックオーバーフローにおけるマルチポストの扱い 上記を熟読の上、しかるべき対処をstackoverflow側に行うことを強くお勧めします。 (本来はコメントに書くべき内容ですがstackoverflowのurlの関係でコメント欄では読みづらいため回答欄に追記させていただきました。) 少々怪しい方法ですがこれ以外の方法が思いつかないので一応参考までに。 ``` static double getMaxScrollTop(TextArea textArea) { Node child = textArea.getChildrenUnmodifiable().stream().findFirst().orElse(null); if (child == null) return 0.0; ScrollPane scrollPane = (ScrollPane)child; Bounds vb = scrollPane.getViewportBounds(); Bounds cb = scrollPane.getContent().getBoundsInLocal(); return Math.max(0.0, cb.getHeight() - vb.getHeight()); } ``` ただ、上記のメソッドはレイアウトが変更中であるようなタイミングで呼び出すと問題が起きるかもしれません。つまり、どのようなタイミングでscrollTopの最大値を知りたいかによって別の配慮が必要となる可能性があると思います。 (レイアウト変更中にgetBoundsInLocalやgetViewportBoundsを呼び出すと、スタックオーバーフローが起きてしまうケースを過去に経験したことがあります。) JavaFXのTextAreaのScrollPaneは(swingの時代とは違い)TextAreaの実装の中に組み込まれており、アプリケーションプログラマーからはブラックボックスになってしまったため、「知りたい情報」が調べにくくなっています。 このあたり個人的にJavaFXの扱いが難しく感じる点ですが、本件についていえば「それを意識することがよくない」とJavaFX設計者が考えているのか、たまたま現在の実装ではまだ実装されていないだけなのか自分には判断がつかないです。 追記: 通常はノードの実装を参照する場合でも のような仕様を見て「確かに内部にこの種類のノードがある」という判断のもとに上のメソッドの1行目などを `Node child = textArea.lookup(".scroll-pane");` としたいところなのですが、CSSスタイルガイドにはTextAreaの内部にScrollPaneがあるとは書かれていないため(実際にプログラムを動かすとわかるのですが・・・)将来のバージョンでずっとこの方法が使えるのやら使えないのやら判断がつかないです。