2017-07-10 3 views
1

Je cherche une alternative de Swing InputVerifier à JavaFX TextField.JavaFX TextField: alternative pour Swing InputVerifier?

Le Swing InputVerifier empêche les entrées vérifiées.

Tenir compte du code Swing JTextField suivant:

InputVerifier iv = new InputVerifier() { 
    /* (non-Javadoc) 
    * @see javax.swing.InputVerifier#verify(javax.swing.JComponent) 
    */ 
    @Override 
    public boolean verify(JComponent input) { 
     JTextField tf = (JTextField) input; 
     if (!myRegExTool.matches(tf.getText())) { 
      return false; 
     } 
     return true; 
    } 
}; 
jinstance.setInputVerifier(iv); 

Je pourrais utiliser TextField.setOnKeyTyped ou un auditeur TextField.textProperty pour vérifier le texte tapé. Cependant cela n'empêchera pas le texte invalide d'entrer dans TextField. Je pourrais cependant supprimer le texte tapé qui ne vérifie pas, mais ce n'est pas une bonne solution.



Solution: Comme suggéré par James_D un TextFormatter avec un filtre est la solution parfaite

UnaryOperator<Change> textFilter = change -> { 
     String input = change.getText(); 
     if (!myRegExTool.matches(input)) { 
      return null; 
     } 
     return change; 
    }; 
    instance.setTextFormatter(new TextFormatter<String>(textFilter)); 
+0

Utilisez un (https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TextFormatter.html) [ 'TextFormatter'] avec un filtre. –

+0

Merci. C'était la solution perferct ici. Pour obtenir le crédit, vous devez créer une réponse que je peux accepter (je pourrais l'éditer ensuite avec mon exemple de code). – DJViking

Répondre

0

Comme première suggérées par James_D un TextFormatter avec filtre a été la solution.

TextField instance = new TextField(); 
UnaryOperator<Change> textFilter = change -> { 
    String input = change.getText(); 
    if (!change.isContentChange()) { 
     return change; 
    } 
    if (!myRegExTool.matches(input)) { 
     return null; 
    } 
    return change; 
}; 
instance.setTextFormatter(new TextFormatter<String>(textFilter)); 
1

Je IntegerField contrôle avec StringConverter, UnaryOperator et TextFormatter. Peut-être utile pour vous!

import javafx.scene.control.TextField; 
import javafx.scene.control.TextFormatter; 
import javafx.util.StringConverter; 
import javafx.util.converter.IntegerStringConverter; 
import java.util.function.UnaryOperator; 

public class IntegerField extends TextField { 

public IntegerField() { 
    super(); 
    StringConverter<Integer> integerStringConverter = new IntegerStringConverter(); 
    UnaryOperator<TextFormatter.Change> filter = getFilter(); 
    setTextFormatter(new TextFormatter<>(integerStringConverter, null, filter)); 
    setOnAction(event -> integerStringConverter.fromString(this.getText())); 
} 

private UnaryOperator<TextFormatter.Change> getFilter() { 
    return change -> { 
     String text = change.getText(); 
     if (!change.isContentChange()) { 
      return change; 
     } 
     if (text.matches("[0-9]*")) { 
      return change; 
     } 
     return null; 
    }; 
} 

public Integer getValue() { 
    return Integer.valueOf(this.getText()); 
} 

} 
+0

J'ai déjà adapté quelque chose de similaire. Bien que je n'avais pas besoin d'un convertisseur, seul le filtre. – DJViking