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

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

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

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

Q&A

1回答

6138閲覧

TableViewのスクロールバーについて

kusukusu

総合スコア29

JavaFX

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

0グッド

0クリップ

投稿2017/01/07 17:03

編集2017/01/08 12:56

現在、TableViewを使用して、ツイッターアプリを開発しています。
streamを使用して誰かがツイートした際に自動的にCellが追加されるようになっています。
そこで発生する問題が、そのツイートに反応しようとした際に今の状態だと自動的にどんどんCellが追加されるので見たいツイートが流れていってしまいます。

なので今回はTableViewのスクロールバーの固定、またはその他、良い方法があればご教示いただきく思います。
よろしくお願いします。

追記。
今回のアプリの場合Twitterアプリということで、
table.getItems.add(0,new ~~省略);
という風にどんどん上に追加しています。
こうするとなぜか操作に支障が出るほどずれてしまいます。
スクロール部分はTableViewにデフォルトでついているものを使用しています。

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

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

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

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

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

guest

回答1

0

自動的にどんどんCellが追加されるので見たいツイートが流れていってしまいます。

とのことですが、特別な制御をせずTableViewがもっているスクロール機能をそのまま利用すると(つまり別途ScrollPaneを用意してその上にTableViewを載せたりしないでという意味)テーブルのitemsプロパティーへ要素を追加しても行が流れていくといった動きにはならず位置はほぼ固定になると思います。追加に伴いドット単位でずれたりはしますが、それでも操作の邪魔になるほど極端にはずれないと思います。

どのような制御をしているのかもう少し詳しく説明したほうがよいと思います。


追記:
要素を上に追加しているということですので2つほどアイデアをコメントします。

  1. 簡単な方法

セルを選択、あるいは別途設けたトグルボタンなどで「メッセージのリアルタイムな表示を保留するモード」を作ると一番簡単にできそうです。追記をやめるので表示されているメッセージから望みのものを探したり選択したりする操作がじゃまされません。UI仕様上はイマイチな感じではありますが実装が簡単です。もしこうするなら保留中に新たにツィートされたらどこかに「1件のツィートを表示保留中」なんて点滅させてやれば保留解除を忘れたりといったことはなくなると思います。

  1. ちょっと面倒な方法

要素を先頭に追記していく方式だとどうしてもビューポートの位置はずれると思います。TableViewの動きを観察した限りでは、要素数が変化した際のスクロールの制御を「ビューポートが先頭から何要素目からの表示となっているかを保存する」としているようです。ですので、その戦略を変えてやる必要があります。具体的には自分でスクロールバーのvalueプロパティーの値を再計算する必要があると思います。

2.の方法は自分はすぐにはわからなかったので少し調べてみました。

ツィートなので各要素の高さはまちまちだと思います。だとすると何要素追加したかで単純にScrollBarのvalueの値を計算できません。リファレンスからscrollTo(itemIndex)みたいなものを期待して探してみたのですが見つかりませんでした(見落としがあるかも知れませんが)。
そこでSkinの中にScrollBarがあるならviewportBoundsを利用すると考えskin階層を調べてみました。しかし以下の通りありませんでした。

Skin(TableView) +com.sun.javafx.scene.control.skin.TableHeaderRow |+javafx.scene.layout.Region |+com.sun.javafx.scene.control.skin.NestedTableColumnHeader ||+javafx.scene.layout.StackPane |+javafx.scene.layout.StackPane ||+javafx.scene.control.Label +com.sun.javafx.scene.control.skin.VirtualFlow |+com.sun.javafx.scene.control.skin.VirtualFlow.ClippedContainer ||+javafx.scene.Group ||javafx.scene.Group |+com.sun.javafx.scene.control.skin.VirtualScrollBar |+com.sun.javafx.scene.control.skin.VirtualScrollBar |+javafx.scene.layout.StackPane +javafx.scene.layout.Region +javafx.scene.layout.Region

ここまで調べた限り自分の知識の範囲内だと上記の階層の実装の中に使えそうなものがないか調べるか、TableCellのジオメトリーから各要素の高さを求めそれをどこかへキャッシュしておいて、それに基づいて前高および先頭アイテム位置から目的の行までの高さを計算してvalueを求めるなどの工夫をしないといけないように思いました。

残念ながらTableViewについてこういう目的で中身を調べたことがないので具体的なアドバイスはできそうもないです。操作感からいえば2.の方がよいのだろうとは思いますが自分なら1で妥協しそうです。

投稿2017/01/07 19:51

編集2017/01/08 13:12
KSwordOfHaste

総合スコア18394

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

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

kusukusu

2017/01/08 09:31 編集

回答ありがとうございます! 説明が不足しておりました申し訳ありません。 通常なら回答通りの結果になると思うのですが、今回のアプリの場合Twitterアプリなので table.getItems.add(0,new ~~省略) という風にどんどん上に追加しています。 こうするとなぜか操作に支障が出るほどずれてしまいます。
KSwordOfHaste

2017/01/08 11:36 編集

言われてみればなるほどそうしますね・・・2つほど方法が思いつくので書いてみます。 ちなみに質問文に情報が不足しているということになりますので、編集して明記してください。
kusukusu

2017/01/08 13:03

ありがとうございます♪ 質問文に追記いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問