環境
- JavaFX 8
callbackの発火タイミング
commitEdit(Double newValue)
- 入力中にEnterなどを押して「確定」した時
startEdit()
- ダブルクリックなどで、入力モードに入った時
- isEditting()はtrue
cancelEdit()
- startEdit()をしたあと、「確定」しないで違うところをクリックするなどをして、キャンセルした時
updateItem(Double item, boolean empty)
- viewに追加したように見えるとき
- rowを追加した時
- rowがいっぱいあって、スクロールした時
- Editし、Enterなどを押して「確定」した時(入力の時は、少しRowが大きくなるからそれの見た目のupdateかと考える)
- startEdit()の後(入力の時は、少しRowが大きくなるからそれの見た目のupdateかと考える)
- 入力モードから確定し、commitEdit()の前
- isEditting()はfalse
入力 -> 確定
ダブルクリック -> updateItem -> startEdit -> 入力 -> Enterを押す -> updateItem -> commitEdit
入力 -> キャンセル
ダブルクリック -> updateItem -> startEdit -> 入力 -> キャンセル -> cancelEdit
注意点
Doubleなので、setConverterをして上げる必要がある
方法
- (方法1)
this.setConverter(new DoubleStringConverter());
- (方法2) DoubleStringConverterを継承した「MyDoubleConverter」を作成し、突っ込む
方法1だと、数値以外の文字を打つと、エンターが押せなくなる(正確にはDouble.valueOf(string)ができないやつのみ->NaNはいけてしまう)
方法2だと、fromString(String value)をOverrideすることで「ユーザが文字を入力し、Enterを押す」と強制的に「0.0」にするとかも可能
「全角の数字にも対応したい」「NaNを入力させたくない」なら、方法2で頑張る
commitEditをOverrideしてどっかのオブジェクトに値を代入している時に気をつけるべきこと
以下のようなコードの時、
Hoge.java
...
@Override
public void commitEdit(Double newValue) {
super.commitEdit(newValue);
this.foo = newValue;
}
...
デフォルトだとstartEditが走った時、入力していたvalueが全て消えてそのままcancelすると、消えたままでcommitEditは走らない。
すぐ思いつくのはprevValueなどでとっておく。
startEdit()とcancelEdit()もOverrideする
Hoge.java
...
@Override
public void startEdit() {
if (this.getText() != "") {
this.prevValue = Double.valueOf(this.getText());
}
super.startEdit();
}
@Override
public void cancelEdit() {
super.cancelEdit();
if (this.prevValue == null) {
return;
}
this.setText(this.prevValue.toString());
}
...