Verwenden Sie die Validierungsfunktion von ControlsFX, um die Eingabeprüfung in JavaFX-Anwendungen zu implementieren. Es sieht wie folgt aus.
Wenn Sie den Cursor auf das Fehlersymbol setzen, wird eine Fehlermeldung als Werkzeugchip angezeigt. (Es fühlt sich ein wenig schwer zu bemerken)
Da ControlsFX verwendet wird, fügen Sie der Abhängigkeit von Gradle oder Maven ControlsFX hinzu. Wenn Sie direkt importieren möchten, laden Sie diese bitte von [hier] herunter (http://fxexperience.com/controlsfx/).
Validator
Validator
bietet einen grundlegenden Mechanismus zum Überprüfen Ihrer Eingabe, und Sie können auch Ihre eigenen Bedingungen definieren. Sie können einen Validator mit den folgenden vier Methoden erstellen.
Validator<T>:: | Bewegung |
---|---|
createEmptyValicator | Setzen Sie die leere Eingabe auf ERROR |
createEqualsValidator | Stellen Sie ERROR für Eingaben ein, die nicht in der Liste enthalten sind |
createRegexValidator | Setzen Sie ERROR auf eine Eingabe, die nicht mit dem regulären Ausdruck übereinstimmt |
createPredicateValidator | Angegebenes Prädikat<S>Stellen Sie die Eingabe ein, die nicht mit ERROR übereinstimmt |
Prädikat <S>
ist eine funktionale Schnittstelle, die einen ** Steuerwert ** annimmt und einen Booleschen
zurückgibt. Sie können Ihre bevorzugten Bedingungen mithilfe von Lambda-Ausdrücken implementieren, sodass Sie klar schreiben können und dies nützlich ist. Geben Sie außerdem die Fehlerstufe (Severity.ERROR
oder Severity.WARNING
) und die Fehlermeldung im Argument an.
Validator (ControlsFX): API Document
Um mehrere Validatoren in einem Steuerelement festzulegen, müssen Sie "Validator
Ein Codebeispiel für die Validierung ist unten angegeben.
ValidationSupport "Valicator" wird verwendet, indem es in der "ValidationSupport" -Klasse registriert wird. Danach erfolgt die Validierung automatisch jedes Mal, wenn der Eingabeinhalt geändert wird, sodass die gesamte Validierung nur mit dem folgenden Beispiel funktioniert.
Verwenden Sie "ValidationSupport :: registerValidator", um den Validator zu registrieren. Sie können festlegen, ob das erforderliche Symbol zum Zeitpunkt der Registrierung angezeigt werden soll.
In initialisieren etc.
ValidationSupport support = new ValidationSupport();
support.registerValidator(textField1, false, Validator.createEmptyValidator(
"Text is required",
Severity.WARNING));
support.registerValidator(textField2, Validator.createEqualsValidator(
"A or B or C is required",
Arrays.asList("A", "B", "C")));
support.registerValidator(textField3, Validator.createRegexValidator(
"Number is required",
Pattern.compile("^[0-9]+$"), Severity.ERROR));
support.registerValidator(checkBox, Validator.createEqualsValidator(
"Check is required",
Collections.singletonList(true)));
support.registerValidator(comboBox, Validator.createEqualsValidator(
"First item is required",
Collections.singletonList(comboBox.getItems().get(0))));
support.registerValidator(colorPicker, Validator.createEqualsValidator(
"WHITE or BLACK is required",
Arrays.asList(Color.WHITE, Color.BLACK)));
support.registerValidator(slider, Validator.createPredicateValidator(
(Double value) -> value > 0.0,
"Positive number is required"));
//Verwenden des statischen Imports
// import static org.controlsfx.validation.Validator.*;
//Dann jedes Mal Validator.Du musst nicht schreiben
Die ValidationSupport
-Klasse verfügt über Eigenschaften für das gesamte Validierungsergebnis. Dies ist nützlich, um einen Mechanismus zu implementieren, der dem gesamten Ergebnis folgt.
//Schaltflächen, die nur gültig sind, wenn alle Ergebnisse gültig sind
Button buttonValidated= new Button();
buttonValidated.disableProperty().bind(support.invalidProperty());
//ListView, um alle Fehlermeldungen anzuzeigen
ListView<ValidationMessage> listView = new ListView<>();
support.validationResultProperty().addListener((o, oldValue, newValue) ->
listView.getItems().setAll(newValue.getMessages()));
ValidationSupport (ControlsFX): API Document
Im obigen Beispiel wird der Fehler nur mit dem Standardsymbol angezeigt. Sie können dies jedoch ändern. Wenn Sie "StyleClassValidateionDecoration" verwenden, wird dem Steuerelement eine Stilklasse hinzugefügt, "Warnung" für Warnungen und "Fehler" für Fehler. Der Implementierer muss den Stil zum Zeitpunkt des Fehlers in der auf "Szene" angewendeten CSS-Datei beschreiben. Es kann auch in Kombination mit der Symbolanzeige verwendet werden.
//Nur für CSS
support.setValidationDecorator(new StyleClassValidationDecoration());
//Wenn Sie Symbole und CSS zusammen verwenden
support.setValidationDecorator(new CompoundValidationDecoration(
new GraphicValidationDecoration(),
new StyleClassValidationDecoration()));
Main.css
.warning{
-fx-border-color: orange;
-fx-border-width: 2;
}
.error{
-fx-border-color: red;
-fx-border-width: 2;
}
Wo kann man FXML usw. lesen?
scene.getStylesheets().addAll(getClass().getResource("Main.css").toExternalForm());
Das Folgende ist die Bildschirmanzeige, wenn Sie das Symbol und CSS zusammen verwenden.
Nur im Fall von CSS gibt es keine Möglichkeit, den Werkzeugchip anzuzeigen. Daher ist es erforderlich, einen Entwurf zu erstellen, um den Fehlerinhalt zu übermitteln.
Es gibt eine Möglichkeit, Symbole und QuickInfos neu zu gestalten, indem Sie "GraphicValidationDecoration" erben und die entsprechende Methode überschreiben.
GraphicValidationDecoration:: | Erläuterung |
---|---|
createErrorNode | Fehlersymbol |
createWarningNode | Warnsymbol |
createRequireDecorations | Erforderliches Symbol |
createTooltip | Tooltip |
Ich denke, es wäre einfacher, einen Teil davon unter Bezugnahme auf die Originalquelle neu zu schreiben. GraphicValidationDecoration (ControlsFX): API Document bitbucket: GraphicValidationDecoration
Code zum Festlegen der geerbten Klasse
support.setValidationDecorator(new YourGraphicValidationDecoration());
Der ControlsFX-Validator weiß nicht, welche Eigenschaft des von Ihnen erstellten benutzerdefinierten Steuerelements überprüft werden soll. Wenn Sie ein Steuerelement validieren möchten, das nicht dem JavaFX-Standard entspricht, müssen Sie es mit dem folgenden Code unterrichten. Klicken Sie hier für eine offizielle Erklärung
//Wenn Sie den Wert einer Eigenschaft für das YourControl-Steuerelement überprüfen möchten
ValueExtractor.addObservableValueExtractor(
c -> c instanceof YourControl,
c -> ((YourControl)c).someProperty());