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

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

ただいまの
回答率

90.33%

  • JavaFX

    410questions

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

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,915

kusukusu

score 20

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

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

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

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


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

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

  2. ちょっと面倒な方法
    要素を先頭に追記していく方式だとどうしてもビューポートの位置はずれると思います。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/08 18:28 編集

    回答ありがとうございます!
    説明が不足しておりました申し訳ありません。

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

    キャンセル

  • 2017/01/08 20:34 編集

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

    キャンセル

  • 2017/01/08 22:03

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

    キャンセル

同じタグがついた質問を見る

  • JavaFX

    410questions

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