2017-02-08 2 views
1

Je suis un ListView dans mon JavaFX App, où je mis en place un moteur de rendu de cellule personnalisée comme suit:JavaFX ListView: custom police pas appliquée correctement

myListView.setCellFactory((params) -> new MyListRenderer()); 

La classe renderer:

class MyListRenderer extends ListCell<MyItemClass> { 

    private final Label text; 

    MyListRenderer() { 
     text = new Label(); 
     text.setFont(Font.font("Monospaced", 12)); 
    } 

    @Override 
    protected void updateItem(MyItemClass item, boolean empty) { 
     super.updateItem(item, empty); 
     if (item == null || empty) { 
      setGraphic(null); 
      setText(null); 
     } else { 
      if(item.isSpecialItem()){ 
       text.setText("\u25B6 " + item.getString(); 
       text.setStyle("-fx-font-weight: bold;"); 
      } else { 
       text.setText(item.getString()); 
       text.setStyle("-fx-font-weight: normal;"); 
      } 
      setGraphic(text); 
     } 
    } 
} 

Comme vous pouvez voir que j'ai mis la police à Monospaced, et aussi j'ai mis le texte et le style selon un drapeau de mes articles ('isSpecialItem')

Ainsi, cela fonctionne bien au début, quand j'ajoute les sapins quelques entrées sont correctement affichées. Cependant, dès que je sélectionne une entrée dans la liste, la police de mon étiquette de texte est réinitialisée à la police par défaut des cellules de la liste. Il est intéressant de noter que seule la police semble être réinitialisée, car le texte que j'ai défini ainsi que le style (gras ou normal) sont toujours correctement appliqués.

J'ai essayé de mettre cette ligne:

text.setFont(Font.font("Monospaced", 12)); 

dans la méthode updateItem, afin qu'il soit à nouveau exécuté sur chaque mise à jour. Cependant, cela ne fonctionne toujours pas, car j'ai remarqué que la méthode n'est même pas appelée lorsque je sélectionne des éléments. Le problème est finalement le suivant: Lors de la sélection dans la vue liste, la police est réinitialisée pour une raison quelconque, et la méthode updateItem n'est même pas rappelée, donc je ne peux pas la remettre à la police désirée.

Quelqu'un sait ce qui se passe ici et comment je peux le réparer?

Merci

Répondre

0

Utiliser le fichier CSS et définir la taille de la famille et la police police à .list-cell:

.list-cell { 
    -fx-font-family: "Monospaced"; 
    -fx-font-size: 12px; 
} 

EDIT

répondre à votre question en commentaire: Oui ce code va changer toutes les cellules de la liste dans votre application.

Vous pouvez créer votre propre sélecteur de classes de style pour une cellule de liste ou un sélecteur de style d'ID spécifique. Voir Skinning JavaFX Applications with CSS et JavaFX CSS Reference Guide, il existe des exemples simples comment les créer.

Dans votre cas fichier CSS:

.custom-list-cell { 
    -fx-font-family: "Monospaced"; 
    -fx-font-size: 12px; 
} 

et MyListRenderer classe:

MyListRenderer() { 
    getStyleClass().add("custom-list-cell"); 
    text = new Label(); 
} 

Notez que cela va changer les polices dans tous les Labeled composants listcell sur commande.

+0

mais ne change-t-il pas alors toutes les listes dans mon application? Malheureusement, je n'ai pas utilisé de CSS jusqu'à présent avec JavaFX, pouvez-vous me donner un exemple de la façon dont je peux configurer ceci pour cette seule liste (que j'ai définie dans un fichier fxml) – user3237736

+0

Vérifiez la réponse. – MBec