Fabbrica di celle a javafx
Sto usando JavaFX 2.0 e Java 7. La domanda riguarda la vista tabella in JavaFX.
Il seguente codice di esempio crea una colonna FirstName e assegna cell factory e cell value factory ad essa.
Callback<TableColumn, TableCell> cellFactory =
new Callback<TableColumn, TableCell>() {
public TableCell call(TableColumn p) {
return new EditingCell();
} };
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setCellValueFactory(
new PropertyValueFactory<Person,String>("firstName")
);
firstNameCol.setCellFactory(cellFactory);
Il mio requisito è che ho una colonna che non si associa direttamente a un singolo attributo nell'oggetto Person, ma è invece un valore personalizzato creato concatenando uno o più attributi dell'oggetto Person.
Considera uno scenario in cui ho una colonna della tabella denominata Nome completo che avrà valori di Prefisso + Cognome+", " + Nome .
1) In questo scenario, come scriverai la fabbrica del valore della cella?
firstNameCol.setCellValueFactory(
new PropertyValueFactory<Person,String>(???????)
);
2) come scriverai cell factory?
In questo scenario abbiamo bisogno di implementare sia cell value factory che cell factory o qualcuno è sufficiente? Se uno è sufficiente allora quale?
Grazie
2 answers
In modo semplice,
Cell Value Factory : è come un "toString()" di solo una parte dell'elemento di riga per quella cella correlata.
Cell Factory : è un renderer della cella dall'elemento cella. Il comportamento predefinito è setText (cell.elemento.toString ()) se l'elemento della cella non è una cella Node
, setGraphic((Node).articolo) in caso contrario. Imposta questa proprietà se la cella dovrebbe supportare la modifica O se vuoi più grafica (controlli) diversa da quella predefinita Label
.
Così per il tuo scenario, lasciando cell factory con il valore predefinito sarà sufficiente (2). Ed ecco il codice di esempio per (1):
firstAndLastNameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> p) {
if (p.getValue() != null) {
return new SimpleStringProperty(p.getValue().getPrefix() + " " + p.getValue().getFirstName() + "," + p.getValue().getLastName());
} else {
return new SimpleStringProperty("<no name>");
}
}
});
Puoi anche modificare il metodo getter del tuo oggetto dati. Nel tuo caso questa è la classe Person, che contiene FirstName, LastName e (presumibilmente) prefisso.
Aggiunge un nuovo metodo alla classe Person:
public String getTotalName() {
return this.prefix + " " + this.getLastName() + ", " + this.getFirstName();
}
E poi basta applicare il CellValueFactory:
totalNameCol.setCellValueFactory(
new PropertyValueFactory<Person,String>("totalName")
);
Trovo questo più comodo e che usare i callback.