2017-06-08 3 views
1

Je souhaite remplir un TableView dans JavaFX. Ma classe est Manual et il a un autre objet comme attribut (User). Comment puis-je remplir une colonne de table avec le nom d'utilisateur de l'objet User.Remplir une tableview dans javafx

columnVanzator.setCellFactory(new Callback<TableColumn<Manual, User>, 
                 TableCell<Manual, User>>() { 

    @Override 
    public TableCell<Manual, User> call(TableColumn<Manual, User> arg0) { 
     final TableCell<Manual, User> cell = new TableCell<Manual, User>() { 
      @Override 
      public void updateItem(final User item, boolean empty) { 
        super.updateItem(item, empty); 
        if (empty) { 
         this.setText(""); 
        } 
        else { 
          this.setText(item.getUsername()); 
        } 
      } 
     }; 
     return cell; 
    } 
}); 

J'ai reçu NullPointerException sur this.setText(item.getUsername());

+0

Ensuite, vous avez quelques instances 'Manual' dans la table avec des valeurs nulles pour l'utilisateur. Faites simplement une vérification null avant d'appeler 'getUsername'. –

+0

Ou, éventuellement, vous n'avez pas défini 'cellValueFactory' pour renvoyer correctement l'élément' User' qui est passé à la cellule créée par votre 'cellFactory'. –

Répondre

1

Qu'est-ce que vous cherchez est pas un cellFactory, mais une cellule Valeur Factory. Une cellule personnalisée est utilisée si le type affiché dans votre colonne est plus complexe qu'une chaîne ou un nombre (par exemple, une date, un état ou des types plus complexes).

cellValueFactory « JavaFX fonctionne mieux avec Propriétés:

column.setCellValueFactory((p) -> p.getValue().yourContentProperty()); 

Mais il semble que vous ne disposez pas d'un JavaFX Propriété pour que votre objet, donc nous devons construire une petite solution:

column.setCellValueFactory((p) -> new SimpleStringProperty(p.getValue().getUsername()); 

Je recommande de construire votre modèle en JavaFX-Style et avoir des propriétés à l'intérieur. Si une valeur change à l'intérieur d'une propriété, TableView met automatiquement à jour la cellule. Il en va de même pour presque tous les contrôles de JavaFX. Mais si vous ne pouvez pas ou ne voulez tout simplement pas, n'hésitez pas à utiliser le mode ci-dessus, mais gardez à l'esprit que les changements de valeur n'alerteront pas automatiquement la vue!