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

Author: user1332356, 2012-05-09

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>");
        }
    }
});
 24
Author: Uluk Biy, 2012-05-10 10:26:26

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.

 7
Author: Peter Ilfrich, 2012-08-08 12:17:03