栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

具有TextFormatter和/或UnaryOperator的JavaFX 8中整数的数字TextField

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

具有TextFormatter和/或UnaryOperator的JavaFX 8中整数的数字TextField

转换器与过滤器不同:转换器指定如何将文本转换为值,并且过滤器过滤器可以更改用户可能进行的操作。听起来两者都需要,但您希望过滤器更准确地过滤允许的更改。

我通常发现,如果更改被接受,则最容易检查文本的新值。您可以选择添加一个

-
,后跟
1-9
任意数量的数字。允许使用空字符串很重要,否则用户将无法删除所有内容。

所以你可能需要像

UnaryOperator<Change> integerFilter = change -> {    String newText = change.getControlNewText();    if (newText.matches("-?([1-9][0-9]*)?")) {         return change;    }    return null;};myNumericField.setTextFormatter(    new TextFormatter<Integer>(new IntegerStringConverter(), 0, integerFilter));

您甚至可以向过滤器添加更多功能,以使其

-
以更智能的方式进行处理,例如

UnaryOperator<Change> integerFilter = change -> {    String newText = change.getControlNewText();    // if proposed change results in a valid value, return change as-is:    if (newText.matches("-?([1-9][0-9]*)?")) {         return change;    } else if ("-".equals(change.getText()) ) {        // if user types or pastes a "-" in middle of current text,        // toggle sign of value:        if (change.getControlText().startsWith("-")) { // if we currently start with a "-", remove first character: change.setText(""); change.setRange(0, 1); // since we're deleting a character instead of adding one, // the caret position needs to move back one, instead of  // moving forward one, so we modify the proposed change to // move the caret two places earlier than the proposed change: change.setCaretPosition(change.getCaretPosition()-2); change.setAnchor(change.getAnchor()-2);        } else { // otherwise just insert at the beginning of the text: change.setRange(0, 0);        }        return change ;    }    // invalid change, veto it by returning null:    return null;};

这将使用户

-
可以随时按下它,并且可以切换整数的符号。

SSCCE:

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 IntegerFieldExample extends Application {    @Override    public void start(Stage primaryStage) {        TextField integerField = new TextField();        UnaryOperator<Change> integerFilter = change -> { String newText = change.getControlNewText(); if (newText.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;        };        // modified version of standard converter that evaluates an empty string         // as zero instead of null:        StringConverter<Integer> converter = new IntegerStringConverter() { @Override public Integer fromString(String s) {     if (s.isEmpty()) return 0 ;     return super.fromString(s); }        };        TextFormatter<Integer> textFormatter =      new TextFormatter<Integer>(converter, 0, integerFilter);        integerField.setTextFormatter(textFormatter);        // demo listener:        textFormatter.valueProperty().addListener((obs, oldValue, newValue) -> System.out.println(newValue));        VBox root = new VBox(5, integerField, new Button("Click Me"));        root.setAlignment(Pos.CENTER);        Scene scene = new Scene(root, 300, 120);        primaryStage.setScene(scene);        primaryStage.show();    }    public static void main(String[] args) {        launch(args);    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/437416.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号