2017-01-06 4 views
1

Ich brauche Intervall der Texteigenschaft eines TextfeldesJavaFX: TextField- Maximal- und Minimalwert von Hörer

int maxLength = 64; 
    int minLength = 0; 
    txtSeuil.textProperty().addListener((v, oldValue, newValue) -> { 
     if (!newValue.matches("\\d*")) { 
      txtSeuil.setText(newValue.replaceAll("[^\\d*{1,2}]", "")); 
      if (txtSeuil.getText().length() > maxLength || txtSeuil.getText().length() < minLength) { 
       String s = txtSeuil.getText().substring(0, maxLength); 
       txtSeuil.setText(s); 
      } 
     } 

    }); 

das Feld akzeptieren nur Zahlen, sondern eine beliebige Anzahl, nicht nur das Intervall

Antwort

1

Wenn ich habe verstanden richtig, Sie versuchen, ein Zahlenfeld zu implementieren, das nur Werte innerhalb des Intervalls [0, 64] erlaubt. Nach this answer ist TextFormatter der empfohlene Weg, um eine solche Funktionalität zu erreichen. Werfen Sie einen Blick auf diesen MWE, das Ihr Problem lösen soll:

public class RestrictedNumberFieldDemo extends Application { 

    public static void main(String[] args) { 
     launch(); 
    } 

    @Override 
    public void start(Stage primaryStage) { 
     TextField numField = new TextField(); 
     numField.setTextFormatter(new TextFormatter<Integer>(change -> { 
      // Deletion should always be possible. 
      if (change.isDeleted()) { 
       return change; 
      } 

      // How would the text look like after the change? 
      String txt = change.getControlNewText(); 

      // There shouldn't be leading zeros. 
      if (txt.matches("0\\d+")) { 
       return null; 
      } 

      // Try parsing and check if the result is in [0, 64]. 
      try { 
       int n = Integer.parseInt(txt); 
       return 0 <= n && n <= 64 ? change : null; 
      } catch (NumberFormatException e) { 
       return null; 
      } 
     })); 

     primaryStage.setScene(new Scene(numField)); 
     primaryStage.show(); 
    } 

} 
2
Werte nicht zu begrenzen,

Um Ihr Problem zu lösen, können Sie benutzerdefinierte Filter für TextFormatter implementieren. Es erlaubt nur Zahlen einzugeben und die Länge der Zeichenfolge einzuschränken. Hier ist Code-Schnipsel, die zeigen, wie es funktioniert kann:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.TextField; 
import javafx.scene.control.TextFormatter; 
import javafx.stage.Stage; 

public class Main5 extends Application { 
    @Override 
    public void start(Stage primaryStage) throws Exception { 
     TextField textField = new TextField(); 
     textField.setTextFormatter(new TextFormatter<Integer>(change -> { 
      if (!change.getText().isEmpty()) { 
       return change.getText().matches("\\d+") && change.getControlNewText().length() <= 5 ? change : null; 
      } 

      return change; 
     })); 

     primaryStage.setScene(new Scene(textField)); 
     primaryStage.show(); 
    } 
} 
+0

danke, es für die Dauer funktioniert, aber ich habe einen Fehler auf dem Code, die minValue und maxValue, die ich will nicht für den Längenwert, sondern vor der Textwert, wie kann ich das beheben? – devhicham

+0

@devhicham was meinst du mit "Textwert"? Nur Zahlen von 0 - 64? – beatngu13

+0

@ beatngu13 ja bitte, ich möchte, dass das Feld akzeptieren nur dieses Intervall Zahlen von 0 bis 64 – devhicham

0

Ihr Problem ist:

Die Längenprüfung wird nicht durchgeführt, wenn die Regex-Übereinstimmungen. Aber der Text kann eine Folge von Ziffern und zu lang sein.

Sie müssen diese Prüfungen unabhängig voneinander durchführen.

Auch Sie legen in einigen Fällen einen neuen Wert fest, der die gleichen Prüfungen erneut auslöst. Natürlich werden sie in den String sein auswertet als gültige Eingabe führen, aber man konnte durch die Einführung eines Feldes in der ChangeListener, dass Geschäfte, ob der Hörer gerade ausgeführt wird, ist die Überprüfung erneut verhindern:

txtSeuil.textProperty().addListener(new ChangeListener<String>() { 

    private boolean validating = false; 

    @Override 
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
     if (!validating) { 
      validating = true; 
      String newText = newValue; 
      boolean modify = false; 
      if (!newValue.matches("\\d*")) { 
       newText = newValue.replaceAll("[^\\d*{1,2}]", ""); 
       modify = true; 
      } 
      if (newText.length() > maxLength || newText.length() < minLength) { 
       newText = newText.substring(0, maxLength); 
       modify = true; 
      } 
      if (modify) { 
       txtSeuil.setText(newText); 
      } 
      validating = false; 
     } 
    } 
}); 
Verwandte Themen