当前位置: 首页 > 知识库问答 >
问题:

JavaFX将valueProperty从TextField的TextFormatter绑定到SimpleDoubleProperty

赫连卓
2023-03-14

我有一个TextField,它有一个TextFormatter,它有一个过滤器,接受TextField的输入,并确保它是双格式的。然后使用DoubleStringConverter将过滤后的文本转换为双精度值。这在自定义FXML组件中。请参见下面的示例。

public SomeComponent implements Initializable {
    @FXML
    public TextField inputField;

    public int min;

    public void initialize(URL location, ResourceBundle resources) {
        UnaryOperator<TextFormatter.Change> doubleFilter = change -> {
            String newText = change.getControlNewText();
            if (newText.matches("-?[0-9]{1,13}(\\.[0-9]*)?")) { 
                return change;
            }
            return null;
        };

        inputField.setTextFormatter(new TextFormatter<>(new DoubleStringConverter(), min, doubleFilter)); 
    }
}

另一个使用此组件的FXML组件...

public SomeView implements Initializable {
    @FXML
    SomeComponent comp;
    public void initialize(URL location, ResourceBundle resources) {
        comp.inputField.getTextFormatter().valueProperty().bindBidirectional(SomeDataManagerClass.SomeSimpleDoubleProperty());
    }
}

bindBidirectional()试图将文本字段的转换值绑定到其他地方存在的SimpleDoubleProperty。但这将返回以下错误:

method Property.bindBidirectional(Property<CAP#1>) is not applicable
(argument mismatch; SimpleDoubleProperty cannot be converted to Property<CAP#1>)

本质上,我想利用TextField的值(不是getText(),而是转换后的值)绑定到其他属性。

我意识到TextFormatter捕获的类型推断有问题,但我在JavaDocs中看不到任何地方显示了如何使用TextFormatter的双值。如果没有简单的方法从TextField中提取DoubleStringConverter,那么使用DoubleStringConverter转换值有什么意义?我可以用双倍的。parseDouble(inputField.getText()),但如果我已经为字段设置了一个好的TextFormatter,那么这似乎毫无意义。

我如何利用TextFor质的值属性之外的一些组件?

共有1个答案

戴嘉珍
2023-03-14

text Formaster属性是一个ObjectProperty

>

  • 将结果强制转换为您期望的任何泛型类型:

    var formatter = (TextFormatter<Number>) comp.inputField.getTextFormatter();
    formatter.valueProperty().bindBidirectional(SomeDataManagerClass.SomeSimpleDoubleProperty());
    

    当然,这将导致未选中的强制转换警告。如果您愿意,您可以通过@SuppressWarings("未选中")注释来抑制警告,但操作仍然不安全。

    保留您自己对文本格式化程序的引用

    public SomeComponent implements Initializable {
    
        @FXML
        public TextField inputField;
    
        // maintain generic information
        private TextFormatter<Number> inputFieldFormatter;
    
        public int min;
    
        public void initialize(URL location, ResourceBundle resources) {
            UnaryOperator<TextFormatter.Change> doubleFilter = change -> {
                String newText = change.getControlNewText();
                if (newText.matches("-?[0-9]{1,13}(\\.[0-9]*)?")) { 
                    return change;
                }
                return null;
            };
    
            inputFieldFormatter = new TextFormatter<>(new NumberStringConverter(), min, doubleFilter);
            inputField.setTextFormatter(inputFieldFormatter)); 
        }
    
        // use this method in your other controller
        public TextFormatter<Number> getInputFieldFormatter() {
            return inputFieldFormatter;
        }
    }
    

    注意,在每种情况下,我都使用了文本格式化程序

  •  类似资料:
    • 问题内容: 我正在尝试通过使用JavaFX 8的TextFormatter为整数创建数字TextField。 UnaryOperator的解决方案: 使用IntegerStringConverter的解决方案: 两种解决方案都有其自身的问题。使用UnaryOperator,我只能按预期输入0到9之间的数字,但是我还需要输入负数,例如“ -512”,其中仅在第一个位置允许使用符号。我也不希望像“ 0

    • 我有一个文本字段,用户在其中输入工资。TF有一个基于默认语言环境的TextFormatter。文本字段旁边有一个标签,在这个标签中,我想显示格式为货币的文本字段文本,为此,我使用以下代码: 如您所见,标签文本没有格式化为数字-因为没有应用格式化程序-。所以我的问题是如何使标签的文本格式化并同时与TextField TextProperty绑定。 有人可能会问:为什么不使用货币格式化程序而不是数字格

    • 我正在使用javafx。场景控制TextFormatter,用于将textfield格式化为货币字段。下面显示了我的代码。 一切正常,只是我不能将整个文本字段退格。 任何帮助都是可观的。非常感谢。

    • 我正在开发一个简单的Java程序来完成一些简单的mySQL内容。它有一个用JavaFX制作的小GUI。 GUI的控制器有一个SimpleBoleanProperty,我们称之为X,它指示到数据库的连接状态。我将一些简单的东西绑定到它,比如按钮的disableProperty so send querys,如果没有连接,应该禁用它。到现在为止,一直都还不错。 我有一个标签,用于执行以下操作: 如果X

    • 我在JavaFX应用程序中使用MVP。 资源: 控制器: 看法 在我的InfoStageView中,只需初始化我的标签和样式我的视图。 如何将我的超链接绑定到我的标签。我尝试了一些方法,但没有成功。我的StringProperty不可点击,但很容易绑定。 我的目标:我想打开带有链接的浏览器。

    • 我试图找到一种简单的方法来链接下载类型的树视图到相同类型的可观察列表。 主控制器。JAVA Download.java 如何实现按对象删除(下载)机制,是否有更简单的方法将observablelist的项绑定到treeview?