javafx-2 ComboBox转换器:没有为空值调用toString(T对象)的方法

时间:2012-11-20 21:39:51

标签: java combobox javafx-2

在javafx2应用程序中,ComboBox应该显示项目列表,在示例中它们是String以简化。

此列表包含null项,因为我希望允许用户做出选择。

由于我正在使用ComboBox的转换器属性,我想知道是否可以使用它来为无选择的情况提供一个很好的表示,例如“[none]”而不是空行。
但我发现永远不会为null项调用toString(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)语句的真正分支从未被调用过。它是一个错误还是一个功能,是否可以自定义空表示?

 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);

我得到另一个行为,也就是说,单击组合选择框中的空项,我得到调用方法toString,但结果没有显示在选择框中。

1 个答案:

答案 0 :(得分:4)

如果用户别无选择,您可以使用setPromptText方法在comboBox中显示“[无]”。

示例代码:

comboBox.setValue(null);

comboBox.setPromptText("[None]");