Usine de cellules à javafx


J'utilise JavaFX 2.0 et Java 7. La question concerne la vue de table dans JavaFX.

L'exemple de code ci-dessous crée une colonne FirstName et lui assigne cell factory et cell value factory.

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

Mon exigence est que j'ai une colonne qui ne correspond pas directement à un seul attribut dans l'objet Person, mais qui est plutôt une valeur personnalisée créée en concaténant un ou plusieurs attributs de l'objet Person.

Considérons un scénario où j'ai une colonne de table nommée Nom complet qui aura des valeurs de Préfixe + Nom+", " + Prénom .

1) Dans ce scénario, comment allez-vous écrire la fabrique de valeurs de cellule?

firstNameCol.setCellValueFactory(
            new PropertyValueFactory<Person,String>(???????)
        );

2) comment allez-vous écrire usine cellulaire?

Dans ce scénario devons-nous implémenter à la fois cell value factory et cell factory ou n'importe lequel est suffisant? Si un est suffisant alors lequel?

Merci

Author: user1332356, 2012-05-09

2 answers

Directement,

Cell Value Factory : c'est comme un "toString()" d'une partie seulement de l'élément de ligne pour cette cellule associée.
Usine Cellulaire : c'est un moteur de rendu de la cellule à partir de la cellule de l'élément. Le comportement par défaut est setText (cell.article.toString ()) si l'élément de cellule n'est pas un Node, setGraphic ((Node) cell.élément dans le cas contraire. Définissez cette propriété si la cellule est censée prendre en charge l'édition OU si vous souhaitez plus de graphiques (contrôles) autres que default Label.

Donc pour votre scénario, en laissant la cellule usine avec la valeur par défaut sera suffisant (2). Et voici un exemple de code pour (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

Vous pouvez également simplement modifier la méthode getter de votre objet de données. Dans votre cas, il s'agit de la classe Person, qui contient FirstName, LastName et (vraisemblablement) prefix.

Ajouter une nouvelle méthode à la classe Personne:

public String getTotalName() {
  return this.prefix + " " + this.getLastName() + ", " + this.getFirstName();
}

Puis appliquez simplement le CellValueFactory:

totalNameCol.setCellValueFactory(
  new PropertyValueFactory<Person,String>("totalName")
);

Je trouve cela plus confortable et que d'utiliser des rappels.

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