JavaFX 文字欄位數字格式

Sheeraz Gul 2022年7月18日
JavaFX 文字欄位數字格式

TextFormatter 類用於建立具有特定格式的欄位。它還可用於在 JavaFX 中建立數字文字欄位。

本教程演示如何在 JavaFX 中建立數字文字欄位。

JavaFX 文字欄位數字格式

JavaFX.scene.control.TextFormatter<V> 用於建立具有特定格式的欄位。Formatter 描述了具有兩種不同結構的格式 TextInputControl 文字。

一個是用於修改使用者輸入的過濾器 getFilter(),另一個是用於提供表示 V 型別值的特殊格式的值轉換器 getValueConverter()TextFormatter 可以僅使用過濾器和值轉換器建立。

TextFormatter 的語法是:

TextFormatter<Integer> Text_Formatter = new TextFormatter<Integer>(String_Converter, 0, Integer_Filter);
Numeric_Field.setTextFormatter(Text_Formatter);

TextFormatter 可以是整數或任何其他型別,setTextFormatter 方法用於將 TextFormatter 應用於欄位。

讓我們嘗試一個建立數字文字欄位的示例:

package delftstack;

import java.util.function.UnaryOperator;

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.control.TextFormatter.Change;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;
import javafx.util.converter.IntegerStringConverter;

public class Numeric_TextField extends Application {

    @Override
    public void start(Stage Demo_Stage) {
        TextField Numeric_Field = new TextField();
        UnaryOperator<Change> Integer_Filter = change -> {
            String Demo_Text = change.getControlNewText();
            if (Demo_Text.matches("-?([1-9][0-9]*)?")) {
                return change;
            } else if ("-".equals(change.getText()) ) {
                if (change.getControlText().startsWith("-")) {
                    change.setText("");
                    change.setRange(0, 1);
                    change.setCaretPosition(change.getCaretPosition()-2);
                    change.setAnchor(change.getAnchor()-2);
                    return change ;
                } else {
                    change.setRange(0, 0);
                    return change ;
                }
            }
            return null;
        };

        StringConverter<Integer> String_Converter = new IntegerStringConverter() {
            @Override
            public Integer fromString(String s) {
                if (s.isEmpty()) return 0 ;
                return super.fromString(s);
            }
        };

        TextFormatter<Integer> Text_Formatter = new TextFormatter<Integer>(String_Converter, 0, Integer_Filter);
        Numeric_Field.setTextFormatter(Text_Formatter);

        // demo listener:
        Text_Formatter.valueProperty().addListener((obs, oldValue, newValue) -> System.out.println(newValue));

        VBox VBox_Root = new VBox(5, Numeric_Field, new Button("Click Here"));
        VBox_Root.setAlignment(Pos.CENTER);
        Scene scene = new Scene(VBox_Root, 300, 120);
        Demo_Stage.setScene(scene);
        Demo_Stage.show();
    }

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

上面的程式碼使用一個 UnaryOperator 作為過濾器和 StringConverter 作為一個值。該程式碼使用 TextFormatter 建立一個僅採用整數值的文字欄位。

見輸出:

JavaFX 數字文字欄位

Author: Sheeraz Gul
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

相關文章 - Java JavaFX