teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

訂正

2017/12/28 09:51

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,3 +1,40 @@
1
+ 訂正:最初の回答は間違っていたようです。申し訳ありません。
2
+ CellのvisibilityはTableViewやCellの基底クラスの方の制御の影響を強く受けるようで、せっかくsetVisible(false)にしても直後にsetVisible(true)にされてしまうことがあるようです。多分Cell領域がTableViewの可視領域に入るとそのような動きになるのではないでしょうか(あくまで想像です)。
3
+
4
+ 本件はどのような対処にするのがよいのか自分には少々難しいです。CheckBoxTableCellのようなカスタムセルの場合、setGraphic()やsetVisible()によって外観を制御しているのですが実際にどのような制御を行っているかは必ずしも明文化されてないと思います。下手に派生クラス側で制御しようとすると基底クラスに予期せぬ制御をされてしまう可能性がある以上、基底クラスの実装まで踏み込んでみないと確実な方法がわかりません。しかし本来隠蔽されているはずの実装に基づき実装するのは危険ですよね・・・。公開されている仕様のみでうまく制御できる方法が思いつけばそれはそれでよいのですが・・・
5
+
6
+ 一応それらしく動くあまり乱暴ではなさそうな方法があったので一応参考までにコードを載せてみます。しかし充分にCheckBoxTableCellの振る舞いを調べた上での実装ではないのでこの実装でよいかどうかはCheckBoxTableCellがどのタイミングでsetGraphicを呼び出すかをよく調べた方がよいと思います。また、こうした対処の常でJDKのバージョンが変わる際に再度検証が必要かも知れません。JavaFXはJDK8時点では充分安定しておらずJDK9で大規模なリファクタリングが行われているようですので要注意と思います。
7
+
8
+ ```java
9
+ Callback<TableColumn<Parson, Boolean>, TableCell<Parson, Boolean>> cb2 = tc -> new CheckBoxTableCell<Parson, Boolean>() {
10
+ @Override
11
+ public void updateItem(Boolean item, boolean empty) {
12
+ super.updateItem(item, empty);
13
+ updateVisiblity();
14
+ }
15
+
16
+ @Override
17
+ public void updateIndex(int i) {
18
+ super.updateIndex(i);
19
+ updateVisiblity();
20
+ }
21
+
22
+ private void updateVisiblity() {
23
+ int index = getIndex();
24
+ boolean visibility = index != -1 &&
25
+ getItem() != null &&
26
+ getTableView().getItems().get(index).getDataType() != 1;
27
+ if (!visibility)
28
+ setGraphic(null);
29
+ }
30
+ };
31
+ ...
32
+ checkCol.setCellFactory(cb2);
33
+ ```
34
+
35
+
36
+ 以下最初の回答
37
+ ---
1
38
  > そもそもやり方が間違っているのかもしれない
2
39
 
3
40
  個人的にはアプローチはよいと思います。ただCellの振る舞いについて注意が必要な点がありそこにはまってしまったのが原因だと思います。

2

コードを補足

2017/12/28 09:51

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -30,7 +30,8 @@
30
30
  return new CheckBoxTableCell<Parson, Boolean>() {
31
31
  ChangeListener<Parson> itemListener = (observable, oldItem, newItem) -> {
32
32
  // newItemに従ってセルの状態を変更する処理
33
+ Parson item = (Parson)newRow.getItem();
33
- ...
34
+ setVisible(item.getDataType() != 1);
34
35
  };
35
36
  { // Cellインスタンスの初期化ブロック(無名クラスにはコンストラクターが書けないので...)
36
37
  tableRowProperty().addListener((observable, oldRow, newRow) -> {

1

誤記訂正

2017/12/28 05:59

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -42,4 +42,4 @@
42
42
  ```
43
43
 
44
44
  ---
45
- (ご質問のコードではlambda式ではなく無名クラスが使われていたりしますJavaFXなのでJava8前提でよい気がしましたのでlambda式を用いたコード例にしました)
45
+ (ご質問のコードではlambda式ではなく無名クラスが使われていたりしますね。でもJavaFXなのでJava8前提でよい気がします。そこでlambda式を用いたコード例にしました)