回答編集履歴
3
訂正
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
コードを補足
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
誤記訂正
answer
CHANGED
@@ -42,4 +42,4 @@
|
|
42
42
|
```
|
43
43
|
|
44
44
|
---
|
45
|
-
(ご質問のコードではlambda式ではなく無名クラスが使われていたりします
|
45
|
+
(ご質問のコードではlambda式ではなく無名クラスが使われていたりしますね。でもJavaFXなのでJava8前提でよい気がします。そこでlambda式を用いたコード例にしました)
|