2016-09-22 2 views
1

J'ai quelques TextFieldTableCell qui sont pour prendre Double valeurs de type de données. Je veux les valider. Si l'utilisateur donne un mauvais type de données en entrée ou garder ce champ vide, je veux marquer que TextFieldTableCell commeCréer un contrôle de validité pour TextFieldTableCell dans JavaFX

Couleur de fond Yello

style couleur texte rouge

Au fin de la validation réussie, je veux que TextFieldTableCell à nouveau normal.

Comment puis-je y arriver?

Répondre

1

Eh bien, vous pourriez réaliser avec soo bien des égards, et les tant de manières a à voir avec la façon dont vous le mettre en œuvre dans le TableCell, mais il sera dépend principalement de la DataHolderObject que vous utilisez pour aider à la virtualization

Pour ce faire, vous devrez créer votre TableCellupdateItem(Object,boolean) pour implémenter la mise à jour de la cellule par rapport aux styles, etc, et cela devrait être en relation avec votre updateSelected(boolean) même si l'un appelle l'autre, ou laisse les deux et utiliser updateIndex() donc quelque chose comme ça pour votre DataHolderclass

private class CellDataHolder { 

    public CellDataHolder (String a){ 
     value = a; 
    } 

    String value = "empty"; //this being the text to show 
    boolean badMatch = false; //this being the flag to index whether the 
    //text matches your preference 
} 

maintenant dans votre cellule, dans une de ces méthodes mentionnées vous ajoutez un chèque de votre article par exemple

@Override 
    public void updateItem(CellDataHolder item, boolean empty) { 
     super.updateItem(item, empty); 
     if(empty){return;} 
     setText(item.value);//set your text 
     if(item.badMatch){//check if the text fits. 
      setStyle(wrongFormatStyle);//this is where you set your bad style 
     }else{ 
      setStyle(normalyStyle);//the style you want 
     } 
    } 

puis dans votre StringConverter vous utiliser pour vérifier si votre texte est valide, le raison pour laquelle je pense que vous devriez utiliser le StringConverter est qu'il peut réduire les appels multiples update...() reçoit, ces méthodes sont appelées soo plusieurs fois n'est pas cool de mettre beaucoup de travail là-bas, votre cellule peut sembler lente, alors mieux vaut le mettre ici, par exemple

setConverter(new StringConverter<CellDataHolder>() { 
      @Override 
      public String toString(CellDataHolder arg0) { 
        arg0.badMatch = 
          arg0.value.matches(".*[a-zA-Z]+.*");//here you add your algorithm 
       return arg0.value; 
      } 

      @Override 
      public CellDataHolder fromString(String arg0) { 
       getItem().value = arg0; 
       return getItem(); 
      } 
     }); 

Vous pouvez également filtrer comment filtre lorsque le contrôle doit être appelé, si une actualisation est appelée ou si une modification explicite est en cours. par exemple

setConverter(new StringConverter<CellDataHolder>() { 
      @Override 
      public String toString(CellDataHolder arg0) { 
       if(isEditing()){ //whether it is an edit 
        arg0.badMatch = 
          arg0.value.matches(".*[a-zA-Z]+.*");//here you add your algorithm 
       } 
       return arg0.value; 
      } 

      @Override 
      public CellDataHolder fromString(String arg0) { 
       getItem().value = arg0; 
       return getItem(); 
      } 
     }); 

Voici un full demo snippet

Démo Aperçu enter image description here

Hope it helps.

+1

Espoir? C'était très utile. Merci beaucoup. :RÉ –