javafx2 アプリケーションでは、ComboBox はアイテムのリストを表示する必要があります。この例ではString
、簡単にするために s になっています。
null
ユーザーが何も選択できないようにしたいので、このリストには項目が含まれています。
ComboBox のコンバーター プロパティをいじっていたので、それを使用して、空行の代わりに "[none]" など、選択肢がない場合の適切な表現を提供できないかと考えました。
しかし、toString(Object object) がヌル項目に対して呼び出されることは決してないことがわかりました。
ケースを再現する最短のコードを以下に示します。バージョン情報が含まれています。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;
public class T05 extends Application {
@Override public void start(Stage primaryStage) throws Exception {
System.out.println(System.getProperty("java.runtime.version"));
System.out.println(System.getProperty("javafx.runtime.version"));
System.out.println(System.getProperty("os.version"));
System.out.println(System.getProperty("os.name"));
ComboBox c = new ComboBox();
//c.setEditable(true);
primaryStage.setScene(new Scene(c));
primaryStage.show();
c.getItems().add("first");
c.getItems().add(null);
c.setConverter(new StringConverter<String>(){
@Override public String toString(String object) {
System.out.print("converting object: ");
if (object==null) {
System.out.println("null");
return "[none]";
}
System.out.println(object.toString());
return object.toString();
}
@Override public String fromString(String string) {
throw new RuntimeException("not required for non editable ComboBox");
}
});
}
}
if (object==null)
これが出力です。ステートメントの true ブランチが呼び出されていないことがわかります。これはバグですか、それとも機能ですか? null 表現をカスタマイズすることはまだ可能ですか?
1.6.0_29-b11
2.2.3-b05
6.1
Windows 7
converting object: first
converting object: first
converting object: first
更新
を追加する(コメントを外すだけです):
c.setEditable(true);
つまり、コンボ選択ボックスで null アイテムをクリックすると、メソッド toString が呼び出されますが、結果が選択ボックスに表示されません。