JavaFX ComboBox устанавливает элементы из ObservableList

Мне нужна помощь, чтобы получить указанный список элементов из ObservableList и добавить их в поле со списком.

Мой ObservableList содержит значение, полученное из БД (в частности, таблица всего с 3 столбцами), и я хочу показать только одно значение столбца в поле со списком. Когда выбрано поле со списком, другие значения взимаются в 2 текстовых полях.

Код следующим образом.

Модель ImportAccettazioni:

public ObservableList<Impostazioni> listImpostazioni = FXCollections.observableArrayList();

public static class Impostazioni {
    private final StringProperty rowid;
    private final StringProperty nome;
    private final StringProperty operatore;
    private final StringProperty delimitatore;

    private Impostazioni(String Rowid, String Nome, String Operatore, String Delimitatore) {
        this.rowid = new SimpleStringProperty(Rowid);
        this.nome = new SimpleStringProperty(Nome);
        this.operatore = new SimpleStringProperty(Operatore);
        this.delimitatore = new SimpleStringProperty(Delimitatore);
    }

    public StringProperty rowidProperty() { return rowid; }
    public StringProperty nomeProperty() { return nome; }
    public StringProperty operatoreProperty() { return operatore; }
    public StringProperty delimitatoreProperty() { return delimitatore; }
}

Импорт АксессиониКонтроллер:

@FXML
private ComboBox<ImportAccettazioniModel.Impostazioni> comboCaricaNome;


// get data from model to popupate combobox
public final void getImpostazioniDataFields() {
    comboCaricaNome.getItems().clear();
    comboCaricaNome.setItems(model.listImpostazioni);
    comboCaricaNome.setCellFactory(new Callback<ListView<Impostazioni>, ListCell<Impostazioni>>() {
        @Override public ListCell<Impostazioni> call(ListView<Impostazioni> p) {
            return new ListCell<Impostazioni>() { 
                    @Override
                    protected void updateItem(Impostazioni t, boolean bln) {
                        super.updateItem(t, bln);
                        if(t != null){
                            setText(t.nomeProperty().toString().toUpperCase());
                            System.out.println("SET PROPERTY " + t.nomeProperty().toString());
                        } else {
                            setText(null);
                        }    

                    }                       
            };
        }
    });

}


comboCaricaNome.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<ImportAccettazioniModel.Impostazioni>() {
        @Override public void changed(ObservableValue<? extends ImportAccettazioniModel.Impostazioni> observable,ImportAccettazioniModel.Impostazioni oldValue, ImportAccettazioniModel.Impostazioni newValue) {
            setTextFields(newValue);
        } 

    });

//set data to textfield with the selected combo box
private void setTextFields(Impostazioni listImpostazioni) {
    //setRowid(Impostazioni.rowidProperty().getValue());
    if (comboCaricaNome.getItems().isEmpty()) {
        editCaricaOperatore.setText("");
        editCaricaDelimitatore.setText("");
    } else {
        editCaricaOperatore.setText(listImpostazioni.operatoreProperty().getValue());
        editCaricaDelimitatore.setText(listImpostazioni.delimitatoreProperty().getValue());
    }   
}

Теперь кажется, что логика работает, но в моем поле со списком нет значения nomeProperty().

Как я могу решить?

заранее спасибо


person Andrea    schedule 09.02.2014    source источник


Ответы (1)


Чтобы получить наблюдаемое значение JavaFX Property, используйте Property.get() или Property.getValue(). По соглашению разработчики Java переопределяют метод toString(), чтобы не отображать сообщение для клиентов, вместо этого он используется для внутреннего использования другими разработчиками.

В результате линия

setText(t.nomeProperty().toString().toUpperCase());

должно быть

setText(t.nomeProperty().getValue().toUpperCase());

ОБНОВЛЕНИЕ:
Поскольку вы используете ComboBox, а не ChoiceBox, вам также следует переопределить свойство ячейки со списком по умолчанию в соответствии с вашими потребностями:

comboCaricaNome.setButtonCell(new ListCell<Impostazioni>() {
    @Override
    protected void updateItem(Impostazioni t, boolean bln) {
        super.updateItem(t, bln);
        if (t != null) {
            setText(t.nomeProperty().getValue().toUpperCase());
        } else {
            setText(null);
        }
    }
});

Как видите, это тот же ListCell, который установлен для cellFactory. Рефакторинг зависит от вас, или, конечно, вы также можете реализовать listcell с другим содержимым.

person Uluk Biy    schedule 09.02.2014
comment
Спасибо за ваше предложение. - person Andrea; 10.02.2014
comment
Моя проблема все еще остается. Поле со списком показывает правильное значение только внутри списка, который открыт для выбора, но при выборе он показывает ссылку (я думаю) наблюдаемого значения. Как я могу решить? - person Andrea; 10.02.2014
comment
Спасибо, Улук, все работает отлично! Спасибо спасибо спасибо ..и спасибо - person Andrea; 10.02.2014