質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

879閲覧

JavaFXのテキストエリアの縦スクロールできる最大量を取得したい

URON

総合スコア20

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/11/19 09:51

JavaFXのテキストエリアのスクロールバーでスクロールできる最大量(スクロールできる高さ)を取得したいのですが、どうやって取得するのかわかりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

URON

2017/11/25 12:59

教えていただきありがとうございます
KSwordOfHaste

2017/11/25 13:17

今後のためにコメントしますね。 削除するくらいなら最初からマルチポストすべきでないと思います。本サイトやstackoverflowは質問&回答を当事者以外の人たちにも情報共有できる点に価値を見出している閲覧者は多いと思います。削除したのでは情報が残りません。
URON

2017/11/25 13:19

そうなんですね。これからは気をつけます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問