JavaFXのテキストエリアのスクロールバーでスクロールできる最大量(スクロールできる高さ)を取得したいのですが、どうやって取得するのかわかりません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
追記:本件の技術的内容とは直接関係ない追記をお許しください。
URONさん、本質問を日本語版stackoverflowにマルチポストされているようですね。
stackoverflow: JavaFXのテキストエリアの縦スクロールできる最大量を取得したい
stackoverflow側にマルチポストの指摘がついたまま放置状態です。この状態はマナー的に非常によくありません。おそらくはそのこと自体をご存知ないのだろうと思います。
上記を熟読の上、しかるべき対処をstackoverflow側に行うことを強くお勧めします。
(本来はコメントに書くべき内容ですがstackoverflowのurlの関係でコメント欄では読みづらいため回答欄に追記させていただきました。)
少々怪しい方法ですがこれ以外の方法が思いつかないので一応参考までに。
java
1static double getMaxScrollTop(TextArea textArea) { 2 Node child = textArea.getChildrenUnmodifiable().stream().findFirst().orElse(null); 3 if (child == null) 4 return 0.0; 5 ScrollPane scrollPane = (ScrollPane)child; 6 Bounds vb = scrollPane.getViewportBounds(); 7 Bounds cb = scrollPane.getContent().getBoundsInLocal(); 8 return Math.max(0.0, cb.getHeight() - vb.getHeight()); 9}
ただ、上記のメソッドはレイアウトが変更中であるようなタイミングで呼び出すと問題が起きるかもしれません。つまり、どのようなタイミングでscrollTopの最大値を知りたいかによって別の配慮が必要となる可能性があると思います。
(レイアウト変更中にgetBoundsInLocalやgetViewportBoundsを呼び出すと、スタックオーバーフローが起きてしまうケースを過去に経験したことがあります。)
JavaFXのTextAreaのScrollPaneは(swingの時代とは違い)TextAreaの実装の中に組み込まれており、アプリケーションプログラマーからはブラックボックスになってしまったため、「知りたい情報」が調べにくくなっています。
このあたり個人的にJavaFXの扱いが難しく感じる点ですが、本件についていえば「それを意識することがよくない」とJavaFX設計者が考えているのか、たまたま現在の実装ではまだ実装されていないだけなのか自分には判断がつかないです。
追記:
通常はノードの実装を参照する場合でも
https://docs.oracle.com/javase/8/javafx/api/javafx/scene/doc-files/cssref.html#text-area
のような仕様を見て「確かに内部にこの種類のノードがある」という判断のもとに上のメソッドの1行目などを
Node child = textArea.lookup(".scroll-pane");
としたいところなのですが、CSSスタイルガイドにはTextAreaの内部にScrollPaneがあるとは書かれていないため(実際にプログラムを動かすとわかるのですが・・・)将来のバージョンでずっとこの方法が使えるのやら使えないのやら判断がつかないです。
投稿2017/11/19 11:19
編集2017/11/25 09:46総合スコア18394
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/25 12:59
2017/11/25 13:17
2017/11/25 13:19