2017-10-01 2 views
-1

J'ai du mal à trouver des guides sur la façon de addEventHandler pour textfield afin qu'il fait la validation en temps réel à partir des éléments clés pour ne permettre hh:mm format de l'heure. J'ai trouvé cette expression ^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$ mais je ne sais pas comment l'ajouter au eventHandler. Aussi j'essayais d'utiliser simpleDateFormat mais sans succès.JavaFX: comment addEventHandler pour textfield de JavaFX pour valider le temps

Edit: Je suis en train de faire quelque chose comme ça (ce fut avec JFrame):

JTextField iegadesVerTesksts = new JTextField(); 
panel.add(iegadesVerTesksts); 
iegadesVerTesksts.addKeyListener(new KeyAdapter() { 
     public void keyTyped(KeyEvent evt) { 
      char c = evt.getKeyChar(); 
      if ((!(Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) || c == KeyEvent.VK_DELETE)) 
        &&evt.getKeyChar()!='.') { 
       evt.consume(); 
      } 
      if(evt.getKeyChar()=='.'&&iegadesVerTesksts.getText().contains(".")){ 
       evt.consume(); 
      } 
     } 
    }); 

En ce moment avec JavaFX J'ai créé principale et piezimes.java. En classe de produit I définir des objets que je veux créer:

public class Piezimes { 
private LocalDate datums; 
private String laiks; 
private String piezime; 

public Piezimes(){ 
    this.datums = null; 
    this.laiks = ""; 
    this.piezime = ""; 
} 

public Piezimes (LocalDate datums, String laiks, String piezime){ 
    this.datums = datums; 
    this.laiks = laiks; 
    this.piezime = piezime; 
} 

public LocalDate getDatums() { 

    return datums; 
} 

public void setDatums(LocalDate datums) { 

    this.datums = datums; 
} 

public String getLaiks() { 

    return laiks; 
} 

public void setLaiks(String laiks) { 
    this.laiks = laiks; 
} 

public String getPiezime() { 

    return piezime; 
} 

public void setPiezime(String piezime) { 

    this.piezime = piezime; 
} 

}

Et dans main.java j'ai créé tableView où à la fin, j'ai ajouté des boutons où j'appelle .getText afin que je puisse l'entrée d'utilisateur. Seulement avec la validation du temps j'ai des problèmes avec. Méthode maintenant que j'appelle pour ajouter une entrée utilisateur à la table est: piezimes.setLaiks(laiksIevade.getText());

+0

https: // stackoverflow. com/questions/31039449/java-8-u40-textformatter-javafx-to-limit-user-input-only-for-nombre-décimal https://stackoverflow.com/a/12851162/2189127 –

+0

@James_D essayé les deux. Ne fonctionne pas pour mon programme ... –

+0

Vous devez réécrire votre question pour montrer ce que vous avez essayé et expliquer de quelle manière cela ne fonctionne pas. Fournir un [MCVE]. Les questions liées fournissent la manière correcte de le faire. –

Répondre

-1

Pour être honnête, je ne suis pas très familier avec TextFormatter. Chaque fois que je veux faire quelque chose comme ça, je fais un TextField personnalisé dans lequel j'ajoute un changeListener au textProperty et je vérifie que l'entrée de l'utilisateur correspond à une regex. Maintenant, dans votre situation, vous devrez en ajouter au moins une à la propriété focusedProperty afin de vérifier si l'utilisateur a laissé l'entrée incomplète et je recommanderais d'en ajouter un de plus pour attraper les événements d'action. Maintenant, je ne suis pas un maître avec des expressions régulières alors soyez indulgent xD. Voici mon implémentation:

class CustomField extends TextField { 

     public CustomField() { 
      super(); 
      textProperty().addListener(new ChangeListener<String>() { 
       @Override 
       public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
        if (newValue.isEmpty()) 
         return; 

        if (newValue.matches("\\d{1,2}|\\d{1,2}:|\\d{1,2}:[0-5]?[0-9]")) { 
         setText(newValue); 
        } else { 
         setText(oldValue); 
        } 
       } 
      }); 

      setOnAction(e -> { 
       if (!getText().matches("\\d{2}:\\d{2}")) { 
        setText(""); 
       } 
      }); 

      focusedProperty().addListener(new ChangeListener<Boolean>() { 
       @Override 
       public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, 
         Boolean newPropertyValue) { 
        if (!newPropertyValue) { 
         if (!getText().matches("\\d{2}:\\d{2}")) { 
          setText(""); 
         } 
        } 
       } 
      }); 
     } 
    } 

Alors que quelque chose d'écriture de l'utilisateur à l'textField tout ce que vous devez faire est de vérifier si elle correspond à la NN: XN (N = nombre 0-9 & X = nombre 0-5) ou juste une partie de celui-ci. Lorsque l'entrée est terminée, vous vérifierez si elle correspond à votre format et seulement alors vous le laisserez être, sinon placez le contenu du champ de texte à "".

Bien sûr, je ne dis pas que c'est la bonne ou au meilleur, mais il est une « solution » pour les gens comme moi qui ne connaissent pas les TextFormatter: P

+0

Je ne veux pas poser une question stupide, mais comment je l'appelle exactement pour mon 'textField'?J'ai créé classe et nouvel objet qui est 'CustomField c1 = new CustomField();'. Mais que faire ensuite? .. Vraiment nouveau pour la programmation, btw ... –

+0

Rien: P juste ajouter le noeud c1 à la scène et il n'acceptera que des entrées avec votre format de désir (Si je vous comprends bien) – JKostikiadis

+0

Ok, je trouvé un problème. Je suis un idiot. J'appelais la validation dans ma méthode de vide tout le temps mais pas dans le 'début de vide '. C'est pourquoi chaque fois que j'essayais de mettre une validation de texte, ça ne marchait pas. Maintenant, cela fonctionne parfaitement bien. Btw, merci beaucoup pour la réponse. –