TextFormatter <T>
ist eine Klasse, die "Konvertierung und Änderung" in einem Texteingabesteuerelement behandelt und durch Festlegen in einem Texteingabesteuerelement wie "TextField" oder "TextArea" verwendet wird. Es hat die folgenden Rollen.
TextFormatter enthält das Datenmodell des Typs, der durch das Typargument T
angegeben wird.
Sie können es mit "getValue ()" abrufen und die Eigenschaft mit "valueProperty ()" abrufen, sodass Sie auch eine Eigenschaftsbindung durchführen können. Außerdem ändern sich dieser "Wert" und der Text "Texteingabesteuerung" nacheinander, unabhängig davon, welcher neu geschrieben wird.
StringConverter
Wenn Sie beispielsweise Daten vom Typ Integer mit "TextField" bearbeiten möchten, müssen Sie sie in eine Textdarstellung konvertieren und anzeigen. Um den bearbeiteten Wert als Ganzzahl zu behandeln, muss der Text analysiert werden. StringConverter ist eine Schnittstelle, die ein Framework für solche Arten der gegenseitigen Konvertierung bietet.
In JavaFX ist bereits ein StringConverter für gängige Typen integriert, sodass Sie hier auswählen können. Paket javafx.util.converter
TextFormatter.Change
TextFormatter.Change
ist eine Klasse, die die Statusänderung des Texteingabesteuerelements enthält. Jedes Mal, wenn ein Texteingabesteuerelement ** manipuliert ** wird, wird eine "Änderung" generiert und an den "TextFormatter" übergeben. Es hat die folgenden Informationen.
TextFormatter.Change (JavaFX): API Document
TextFormatter hat die Funktion, diese "Änderung" zu verarbeiten. Mit anderen Worten, Sie können die Änderungen, die Sie nicht mögen, durch "Ändern" durch andere Änderungen ersetzen. In TextFormatter wird diese Operation als Filter bezeichnet und kann als funktionale Schnittstelle implementiert werden, die "Change" empfängt und "Change" zurückgibt.
UnaryOperator<TextFormatter.Change> filter;
Die Auswahl wird als zwischen dem Anker und dem Carryt definiert. Der Übertrag ist die aktuelle Position, an der Sie eingeben. Beachten Sie jedoch, dass dies zu Beginn und am Ende der Auswahl unterschiedliche Auswirkungen hat.
TextFormatter wird durch Übergabe von StringConverter, Filter oder beidem erstellt. TextFormatter (JavaFX): API Document
Unten ist ein Beispiel.
Versuchen Sie, die integrierte Klasse "CurrencyStringConverter" zu verwenden, um Number als Währung anzuzeigen.
Beispiel
TextFormatter<Number> currencyFormatter = new TextFormatter<>(
new CurrencyStringConverter(Locale.JAPAN),
0,
change -> {
//Die Auswahl kann nicht vor dem ersten Zeichen erfolgen
change.setAnchor(Math.max(1, change.getAnchor()));
change.setCaretPosition(Math.max(1, change.getCaretPosition()));
//Der Textänderungsbereich darf nicht vor dem ersten Zeichen liegen
change.setRange(Math.max(1, change.getRangeStart()), Math.max(1, change.getRangeEnd()));
return change;
});
textField1.setTextFormatter(currencyFormatter);
"" Wird immer am Anfang angezeigt. Wenn die Eingabetaste gedrückt wird, führt CurrencyStringConverter eine gegenseitige Konvertierung durch, z. B. "¥ 100000" → 100000 → "¥ 100.000", und 100000 wird auf "Wert" von "TextFormatter" gesetzt.
Dank value
kann die Darstellung des Textfeldes und des Datenmodells getrennt behandelt werden. Das folgende Beispiel zeigt, wie die Zeichen rot werden, wenn die Zahl 30000 oder weniger beträgt.
Beispiel
currencyFormatter.valueProperty().addListener((o, oldValue, newValue) -> {
textField1.setStyle(newValue.intValue() <= 30000 ?
"-fx-text-fill: red" : "-fx-text-fill: black");
});
Zusätzlich wird ein Filter an diesen "TextFormatter" übergeben, so dass das erste Zeichen "" nicht ausgewählt, gelöscht oder geändert werden kann. Unten finden Sie eine Auswahl aller, indem Sie Strg-A drücken.
Beispiel
Pattern notNumberPattern = Pattern.compile("[^0-9]+");
TextFormatter<String> lowerFormatter = new TextFormatter<>(change -> {
String newStr = notNumberPattern.matcher(change.getText()).replaceAll("");
int diffcount = change.getText().length() - newStr.length();
change.setAnchor(change.getAnchor() - diffcount);
change.setCaretPosition(change.getCaretPosition() - diffcount);
change.setText(newStr);
return change;
});
textField2.setTextFormatter(lowerFormatter);
Dieser TextFormatter
wird nur dem Filter übergeben und ist ein Mechanismus, um den Änderungsdifferenztext jedes Mal durch nur Zahlen zu ersetzen. Unten befindet sich das Textfeld nach Eingabe von "2017-04-01T12: 00: 00".
Da der Filter jedes Update konvertiert, funktioniert er nicht nur für die Tasteneingabe, sondern auch für das Kopieren und Einfügen sowie die Werteinstellung durch "TextField :: setText".
Ich habe ein IPv4-Adressfeld erstellt, in das Sie für jedes Byte einen numerischen Wert eingeben können. Sie können nur Zahlen bearbeiten und "eingeben". Wählt das Byte rechts aus.
Beispiel
textField3.setTextFormatter(new Inet4AddressFormatter(null));
Die Bestimmung der Maus- und Tastenbedienung des Benutzers anhand der Änderungsdifferenz ist begrenzt. Wenn Sie etwas ausführlicher machen möchten, sollten Sie einen anderen Ansatz in Betracht ziehen.
Da der Filter praktisch ist, weil er nur den geänderten Teil des Textfelds gleichzeitig kennen kann, scheint er häufig leicht als Alternative zum ChangeListener des Textfelds verwendet zu werden.
Yutchis Blog: Ich habe auch versucht, formatierten Text in JDK8u40 hinzuzufügen. Quelle: GitHub FXLM: GitHub