【问题标题】:Java bindBidirectionalJava 绑定双向
【发布时间】:2022-01-05 14:19:35
【问题描述】:

我有以下问题。我的任务是在我的数独字段对象和它在 GUI 中的图形形式之间创建一个双键。到目前为止,我已经设法想出了这样的东西。

TextField textField = new TextField();

JavaBeanIntegerPropertyBuilder builder = JavaBeanIntegerPropertyBuilder.create();
JavaBeanIntegerProperty test =  builder.bean(board.getSudokuField(i,j))
        .name("FieldValue").build();
StringConverter<Number> converter = new NumberStringConverter();
Bindings.bindBidirectional(textField.textProperty(), test, converter);

该解决方案有效,但如果您输入除数字以外的任何字符,则会引发解析错误。

原因:java.text.ParseException:无法解析的数字:“a”

这是以某种方式改变债券类型的最佳方法吗?或添加有关输入值的条件,但我只是不知道该怎么做。 board.getSudokuField(i,j) 返回 SudokuField 对象。 还有 int getFieldValue() 返回 int 和 void setFieldValue(int value)

【问题讨论】:

  • 使用TextFormatter 确保仅在文本字段中输入有效值。通常最好绑定到格式化程序的valueProperty 而不是文本。使用 JavaFX 属性而不是使用普通的 Java bean 和适配器来构建 SudokuField 类也可能会更好。
  • 谢谢你的工作
  • 如果您有工作版本,您可以self-answer 以便其他人可以看到解决方案的代码。

标签: java user-interface javafx binding


【解决方案1】:

所以这是我的解决方案,输入到 TextField 中的数字只能是 1 到 9 之间的数字。

 TextField textField = new TextField();

                JavaBeanIntegerPropertyBuilder builder =
                        JavaBeanIntegerPropertyBuilder.create();
                JavaBeanIntegerProperty test =  builder.bean(board.getSudokuField(i,j))
                        .name("FieldValue").build();
                StringConverter<Number> converter = new NumberStringConverter();

            textField.setTextFormatter(new TextFormatter<>(c -> {
                if (c.isContentChange()) {
                    if (c.getControlNewText().length() == 0) {
                        return c;
                    }

                    try {
                        Integer.parseInt(c.getControlNewText());
                        if (Integer.parseInt(c.getControlNewText()) > 9
                                || Integer.parseInt(c.getControlNewText()) == 0) {
                            return null;
                        }

                        return c;
                    } catch (NumberFormatException ignored) {
                        ignored.getMessage();
                    }
                    return null;
                }
                return c;
            }));
                Bindings.bindBidirectional(textField.textProperty(), test, converter);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 2016-04-19
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    相关资源
    最近更新 更多