添加javafx文本字段的侦听器,最多小数点后2位

添加javafx文本字段的侦听器,最多小数点后2位,java,javafx-8,scenebuilder,Java,Javafx 8,Scenebuilder,我想将javaFX文本字段设置为小数点后两位。我找到了答案,但它是数值。e-g // force the field to be numeric only textField.textProperty().addListener(new ChangeListener<String>() { @Override public void changed(ObservableValue<? extends String> observable, String

我想将javaFX文本字段设置为小数点后两位。我找到了答案,但它是数值。e-g

 // force the field to be numeric only
textField.textProperty().addListener(new ChangeListener<String>() {
    @Override
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
        if (!newValue.matches("\\d*")) {
            textField.setText(newValue.replaceAll("[^\\d]", ""));
        }
    }
});
//强制该字段仅为数字
textField.textProperty().addListener(新的ChangeListener()){
@凌驾

public void已更改(ObservalEvalue在文本字段上使用文本格式设置程序。该模式只需匹配任何可能的小数点,最多两位小数。(类似于可选负号,后跟任意数字,然后可选后跟小数点和0-2位。)只要让文本格式化程序在结果文本与该模式匹配时接受更改,否则拒绝更改即可

import java.util.function.UnaryOperator;
import java.util.regex.Pattern;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.control.TextFormatter.Change;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class DecimalTextField extends Application {

    @Override
    public void start(Stage primaryStage) {
        Pattern decimalPattern = Pattern.compile("-?\\d*(\\.\\d{0,2})?");

        UnaryOperator<Change> filter = c -> {
            if (decimalPattern.matcher(c.getControlNewText()).matches()) {
                return c ;
            } else {
                return null ;
            }
        };

        TextFormatter<Double> formatter = new TextFormatter<>(filter);

        TextField textField = new TextField();
        textField.setTextFormatter(formatter);
        StackPane root = new StackPane(textField);
        root.setPadding(new Insets(24));

        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
import java.util.function.UnaryOperator;
导入java.util.regex.Pattern;
导入javafx.application.application;
导入javafx.geometry.Insets;
导入javafx.scene.scene;
导入javafx.scene.control.TextField;
导入javafx.scene.control.TextFormatter;
导入javafx.scene.control.TextFormatter.Change;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
公共类DecimalTextField扩展了应用程序{
@凌驾
公共无效开始(阶段primaryStage){
Pattern decimalPattern=Pattern.compile(“-?\\d*(\\.\\d{0,2}”);
一元运算符筛选器=c->{
if(decimalPattern.matcher(c.getControlNewText()).matches()){
返回c;
}否则{
返回null;
}
};
TextFormatter formatter=新的TextFormatter(过滤器);
TextField TextField=新的TextField();
setTextFormatter(格式化程序);
StackPane root=新的StackPane(textField);
根。设置填充(新插图(24));
primaryStage.setScene(新场景(根));
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}

我无法抗拒。这是上面两行的答案(完成所有工作的那一行)

private静态文本格式化程序new3DecimalFormatter(){
Pattern decimalPattern=Pattern.compile(“-?\\d*(\\.\\d{0,3}”);
返回新的TextFormatter(c->(decimalPattern.matcher(c.getControlNewText()).matches())?c:null);
}

看看TextFormatter。你可以用一个UnaryOperator定义所有这些,或者在TextField上有绑定,而UnaryOperator对它不起作用。有什么模式可以应用到属性listner上吗?我不理解最后两条注释。你的问题是要包含这些信息。如果你的文本字段的文本绑定到某个东西,用户将无法使用它输入。是的,不允许用户输入…textfield不可编辑。textfield从绑定属性获取值,我找不到任何在绑定属性中设置小数点的方法。这就是为什么我要在textfield上设置侦听器。或者,如果有可能在绑定属性中应用小数点,请指导我…我会感谢詹姆斯先生_D@ZubairCH同样,请用这些信息回答问题。如果你想要一个有用的答案,你需要实际描述你正在尝试做什么。
import java.util.function.UnaryOperator;
import java.util.regex.Pattern;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.control.TextFormatter.Change;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class DecimalTextField extends Application {

    @Override
    public void start(Stage primaryStage) {
        Pattern decimalPattern = Pattern.compile("-?\\d*(\\.\\d{0,2})?");

        UnaryOperator<Change> filter = c -> {
            if (decimalPattern.matcher(c.getControlNewText()).matches()) {
                return c ;
            } else {
                return null ;
            }
        };

        TextFormatter<Double> formatter = new TextFormatter<>(filter);

        TextField textField = new TextField();
        textField.setTextFormatter(formatter);
        StackPane root = new StackPane(textField);
        root.setPadding(new Insets(24));

        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
private static TextFormatter<Double> new3DecimalFormatter(){
        Pattern decimalPattern = Pattern.compile("-?\\d*(\\.\\d{0,3})?");
        return new TextFormatter<>(c -> (decimalPattern.matcher(c.getControlNewText()).matches()) ? c : null );
}