2014-02-09 91 views
2

设定的项目,我需要帮助,从ObservableList得到物品的指定列表,并将其添加到组合框。JavaFX的组合框从ObservableList

我ObservableList包含DB收到(具体表格只有3列)值,我想只显示一个组合框列值。当选择组合框时,其他值将在2个文本框中收取费用。

代码如下。

ImportAccettazioniModel:

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

ImportAccettazioniController:

@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()。

我该如何解决?

在此先感谢

回答

2

要得到的JavaFX Property使用Property.get()Property.getValue()的观测值。 按照惯例,Java开发人员重写toString()方法不显示客户信息,而是用于由另一开发商内部用途。

其结果是,该行

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

应该

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

UPDATE:
由于您使用的是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); 
     } 
    } 
}); 

正如你可以看到这是一个设置为cellFactory相同的ListCell。重构取决于你,当然你也可以实现一个具有不同内容的列表单元。

+0

感谢您的建议。 – Andrea

+0

我的问题仍然存在。组合框仅在打开供选择的列表内显示正确的值,但选定时显示观察值的参考(我认为)。我该如何解决? – Andrea

+0

@Andrea请参阅更新。 –