回答編集履歴

2

誤記

2017/01/08 13:12

投稿

KSwordOfHaste
KSwordOfHaste

スコア18392

test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  追記:
18
18
 
19
- 要素を上に追しているということですので2つほどアイデアをコメントします。
19
+ 要素を上に追しているということですので2つほどアイデアをコメントします。
20
20
 
21
21
 
22
22
 

1

追記

2017/01/08 13:12

投稿

KSwordOfHaste
KSwordOfHaste

スコア18392

test CHANGED
@@ -7,3 +7,83 @@
7
7
 
8
8
 
9
9
  どのような制御をしているのかもう少し詳しく説明したほうがよいと思います。
10
+
11
+
12
+
13
+ ---
14
+
15
+
16
+
17
+ 追記:
18
+
19
+ 要素を上に追記しているということですので2つほどアイデアをコメントします。
20
+
21
+
22
+
23
+ 1. 簡単な方法
24
+
25
+ セルを選択、あるいは別途設けたトグルボタンなどで「メッセージのリアルタイムな表示を保留するモード」を作ると一番簡単にできそうです。追記をやめるので表示されているメッセージから望みのものを探したり選択したりする操作がじゃまされません。UI仕様上はイマイチな感じではありますが実装が簡単です。もしこうするなら保留中に新たにツィートされたらどこかに「1件のツィートを表示保留中」なんて点滅させてやれば保留解除を忘れたりといったことはなくなると思います。
26
+
27
+
28
+
29
+ 2. ちょっと面倒な方法
30
+
31
+ 要素を先頭に追記していく方式だとどうしてもビューポートの位置はずれると思います。TableViewの動きを観察した限りでは、要素数が変化した際のスクロールの制御を「ビューポートが先頭から何要素目からの表示となっているかを保存する」としているようです。ですので、その戦略を変えてやる必要があります。具体的には自分でスクロールバーのvalueプロパティーの値を再計算する必要があると思います。
32
+
33
+
34
+
35
+ 2.の方法は自分はすぐにはわからなかったので少し調べてみました。
36
+
37
+
38
+
39
+ ツィートなので各要素の高さはまちまちだと思います。だとすると何要素追加したかで単純にScrollBarのvalueの値を計算できません。リファレンスからscrollTo(itemIndex)みたいなものを期待して探してみたのですが見つかりませんでした(見落としがあるかも知れませんが)。
40
+
41
+ そこでSkinの中にScrollBarがあるならviewportBoundsを利用すると考えskin階層を調べてみました。しかし以下の通りありませんでした。
42
+
43
+
44
+
45
+ ```
46
+
47
+ Skin(TableView)
48
+
49
+ +com.sun.javafx.scene.control.skin.TableHeaderRow
50
+
51
+ |+javafx.scene.layout.Region
52
+
53
+ |+com.sun.javafx.scene.control.skin.NestedTableColumnHeader
54
+
55
+ ||+javafx.scene.layout.StackPane
56
+
57
+ |+javafx.scene.layout.StackPane
58
+
59
+ ||+javafx.scene.control.Label
60
+
61
+ +com.sun.javafx.scene.control.skin.VirtualFlow
62
+
63
+ |+com.sun.javafx.scene.control.skin.VirtualFlow.ClippedContainer
64
+
65
+ ||+javafx.scene.Group
66
+
67
+ ||javafx.scene.Group
68
+
69
+ |+com.sun.javafx.scene.control.skin.VirtualScrollBar
70
+
71
+ |+com.sun.javafx.scene.control.skin.VirtualScrollBar
72
+
73
+ |+javafx.scene.layout.StackPane
74
+
75
+ +javafx.scene.layout.Region
76
+
77
+ +javafx.scene.layout.Region
78
+
79
+ ```
80
+
81
+
82
+
83
+ ここまで調べた限り自分の知識の範囲内だと上記の階層の実装の中に使えそうなものがないか調べるか、TableCellのジオメトリーから各要素の高さを求めそれをどこかへキャッシュしておいて、それに基づいて前高および先頭アイテム位置から目的の行までの高さを計算してvalueを求めるなどの工夫をしないといけないように思いました。
84
+
85
+
86
+
87
+ 残念ながらTableViewについてこういう目的で中身を調べたことがないので具体的なアドバイスはできそうもないです。操作感からいえば2.の方がよいのだろうとは思いますが自分なら1で妥協しそうです。
88
+
89
+