JavaFX2中的组合框键值对

JavaFX2中的组合框键值对,java,javafx-2,Java,Javafx 2,我刚刚开始学习JavaFX2。 现在我正在尝试构建一个示例应用程序。然后我被卡在组合框中。 我在JavaFX中没有找到任何对combobox的键值对的引用。 位于的组合框javadoc没有太多关于键值对的内容 如何创建具有不同显示值和实际值的项目的组合框?您有两种方法: 1.只需重写datamodel类中的toString()方法。例如: public class Demo extends Application { private final ObservableList<Em

我刚刚开始学习JavaFX2。
现在我正在尝试构建一个示例应用程序。然后我被卡在组合框中。
我在JavaFX中没有找到任何对combobox的键值对的引用。
位于的组合框javadoc没有太多关于键值对的内容

如何创建具有不同显示值和实际值的项目的组合框?

您有两种方法:
1.只需重写datamodel类中的
toString()
方法。例如:

public class Demo extends Application {

    private final ObservableList<Employee> data =
            FXCollections.observableArrayList(
            new Employee("Azamat", 2200.15),
            new Employee("Veli", 1400.0),
            new Employee("Nurbek", 900.5));

    @Override
    public void start(Stage primaryStage) {

        ComboBox<Employee> combobox = new ComboBox<>(data);
        combobox.getSelectionModel().selectFirst(); // Select first as default
        combobox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Employee>() {

            @Override
            public void changed(ObservableValue<? extends Employee> arg0, Employee arg1, Employee arg2) {
                if (arg2 != null) {
                    System.out.println("Selected employee: " + arg2.getName());
                }
            }
        });
        StackPane root = new StackPane();
        root.getChildren().add(combobox);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }

    public static class Employee {
        private String name;
        private Double salary;

        @Override
        public String toString() {
            return name + " (sal:" + salary + ")";
        }

        public Employee(String name, Double salary) {
            this.name = name;
            this.salary = salary;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Double getSalary() {
            return salary;
        }

        public void setSalary(Double salary) {
            this.salary = salary;
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

这种方法可以对单元渲染进行更强大的控制。您不仅可以格式化显示值,还可以将任何节点(控件)包含到单元格(本例中为按钮)中,并添加一些查看逻辑(item.getSalary()?“”:“”)。实际值与ie Employee实例保持相同。

还有另一个解决方案,即实现一个。它对对象非常有用:

public class Product {

    private String code;
    private String name;

    public Product(String code, String name) {
        this.code = code;
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
转换器实现:

public class ProductConverter extends StringConverter<Product> {

    /** Cache of Products */
    private Map<String, Product> productMap = new HashMap<String, Product>();

    @Override
    public String toString(Product product) {
        productMap.put(product.getName(), product);
        return product.getName();
    }

    @Override
    public Product fromString(String name) {
        return productMap.get(name);
    }

}

我知道这个问题由来已久,但因为我只是花了几个小时在这个问题上进行毫无意义的挖掘,所以我必须分享结果。看起来,即使列表中有重复的字符串,带有重写的toString()方法的ComboBox也能正确地将字符串解析回对象。分辨率必须基于索引,并且toString()仅用于演示。

您看过吗?@assylias-看过。它没有提到任何关于创建具有键值对的组合框的内容,只是一个包含一些项目的普通组合框。非常感谢您的回答。这就是我要找的。我对它做了一个小小的修改,这样它就可以像普通的组合框一样显示项目,而不是在列表中显示按钮。如果我们对键值对使用hashmap,它会是什么样子?它会使用笨拙的
公共无效更改(observevalue)吗
public class ProductConverter extends StringConverter<Product> {

    /** Cache of Products */
    private Map<String, Product> productMap = new HashMap<String, Product>();

    @Override
    public String toString(Product product) {
        productMap.put(product.getName(), product);
        return product.getName();
    }

    @Override
    public Product fromString(String name) {
        return productMap.get(name);
    }

}
    ComboBox<Product> cboProducts  = new ComboBox<Product>;
    cboProducts.setConverter(new ProductConverter());
    cboProducts.getItems().addAll(serviceManager.getProductList());
cboProducts.getValue()