Verwenden Sie JavaFX / TextFormatter

Umgebung

Was ist Textformatierer?

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.

Aufbewahrung des Datenmodells

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

Filter

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

Was ist ein Filter?

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;

Über die Auswahl

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.

a.png

Beispiel für die Verwendung von TextFormatter

TextFormatter wird durch Übergabe von StringConverter, Filter oder beidem erstellt. TextFormatter (JavaFX): API Document

Unten ist ein Beispiel.

Textfeld zum Bearbeiten der Währung des japanischen Yen

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);

b.png

"" 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");
});

9.png

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.

c.png

Textfeld, in das nur Zahlen eingegeben werden können

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".

e.png

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".

Textfeld zum Bearbeiten der IPv4-Adresse

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.

f.png

Inet4AddressFormatter.java

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.

Eine andere Verwendung von TextFormatter

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.

Referenz

Yutchis Blog: Ich habe auch versucht, formatierten Text in JDK8u40 hinzuzufügen. Quelle: GitHub FXLM: GitHub

Recommended Posts

Verwenden Sie JavaFX / TextFormatter
Verwenden Sie die Zwischenablage-API von JavaFX
[JavaFX] [Java8] Verwendung von GridPane
Verwenden Sie before_action! !!
JavaFX-Text
Verwenden Sie XMLHttpRequest
JavaFx-Memorandum
Verwenden Sie AutosizingTextView