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