执行combobox.get时,Javafx Combobox列表索引设置为-1(someobject)

时间:2015-02-21 01:23:39

标签: javafx-8 jcombobox

我有一个用以下ObservableList填充的组合框:

final ObservableList<SimplePerson> persons = FXCollections.observableArrayList(
        new SimplePerson("Jacob", 1),
        new SimplePerson("Isabella", 2),
        new SimplePerson("Ethan", 3),
        new SimplePerson("Emma", 4),
        new SimplePerson("Michael", 5)
);

组合框的选定索引将设置为-1,组合框的文本框将填充&#34; Michael&#34;以及&#34; Michael&#34;我运行时不会选择下拉列表中的项目

setValue(new SimplePerson("Michael",5))

以下是一些示例代码(SSCCE)

import javafx.application.Application;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.property.IntegerProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TableView;
import javafx.stage.Stage;
import javafx.util.StringConverter;
import javafx.util.Callback;
import javafx.scene.control.ListView;
import javafx.scene.control.ListCell;

public class ComboBoxDemo extends Application {

public class SimplePerson {

    private StringProperty name;
    private IntegerProperty id;
    private String somethingElse;

    public SimplePerson(String name, Integer id) {
        setName(name);
        setId(id);
    }

    public final void setName(String value) {
        nameProperty().set(value);
    }

    public final void setId(Integer id) {
        idProperty().set(id);
    }

    public String getName() {
        return nameProperty().get();
    }

    public int getId() {
        return idProperty().get();
    }

    public StringProperty nameProperty() {
        if (name == null) {
            name = new SimpleStringProperty(this, "name");
        }
        return name;
    }

    public IntegerProperty idProperty() {

        if (id == null) {
            id = new SimpleIntegerProperty(this, "id");
        }
        return id;
    }

    @Override
    public String toString() {
        return name.get();
    }
}

final ObservableList<SimplePerson> persons = FXCollections.observableArrayList(
        new SimplePerson("Jacob", 1),
        new SimplePerson("Isabella", 2),
        new SimplePerson("Ethan", 3),
        new SimplePerson("Emma", 4),
        new SimplePerson("Michael", 5)
);


@Override
public void start(Stage stage) throws Exception {

    final ComboBox<SimplePerson> cb = new ComboBox<>();

    final ComboBox<String> cb2 = new ComboBox<>();
    cb.setItems(persons);
    cb.setEditable(true);
    cb.setConverter(new StringConverter<SimplePerson>() {

        @Override
        public String toString(SimplePerson p) {

            if (p != null) {
                System.out.println("Looking up toString " + p.getName());
                return p.getName();
            } else {
                System.out.println("Looking up toString null");
                return "";
            }

        }

        @Override
        public SimplePerson fromString(String name) {
            if (cb.getValue() != null) {
                ((SimplePerson) cb.getValue()).setName(name);
                cb.show();
                System.out.println("Here I am" + ((SimplePerson) cb.getValue()).getName());
                return (SimplePerson) cb.getValue();
            }
            System.out.println("Returning null");
            return null;
        }
    });


    stage.setScene(new Scene(cb));
    stage.show();

    cb.setCellFactory(new Callback<ListView<SimplePerson>, ListCell<SimplePerson>>() {
        @Override
        public ListCell<SimplePerson> call(ListView<SimplePerson> l) {
            return new ListCell<SimplePerson>() {
                @Override
                protected void updateItem(SimplePerson item, boolean empty) {
                    super.updateItem(item, empty);

                    if (item == null || empty) {
                        System.out.println("I'm null");
                    } else {
                        System.out.println("Go get them " + item.getName());
                        setText(item.getName());
                    }
                }
            };
        }
    });

    cb.setValue(new SimplePerson("Michael", 5));
    System.out.println(cb.getSelectionModel().getSelectedIndex());
    System.out.println(cb.getValue().getName());
}

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

}

}

当ObservableList包含字符串

时,下拉列表将选择正确的项目
ObservableList<String>

1 个答案:

答案 0 :(得分:0)

您正在将new Object传递给setValue()进入ComboBox。弹出ComboBox时显示的 Michael与下拉列表中的Michael不同

如果您通过cb.setValue(new SimplePerson("xyz", 5));,则ComboBox会将最初选择的项目显示为xyz,其中xyz不在人员列表中。

要设置确切的对象,您需要从原始引用中获取它们,在您的情况下是ObservableList<SimplePerson> persons。要获取Michael,我们使用其索引:

cb.setValue(persons.get(4));