首页 > 解决方案 > 在从 TextField (FXML) 扩展的自定义类中分配布尔值时出错

问题描述

我开始学习 JavaFX 并遇到了这个问题:我有一个 TextBox 类从 TextField 扩展

package sample;

import javafx.fxml.FXML;
import javafx.scene.control.TextField;

public class TextBox extends TextField {

    private int maxLength = 255;
    private boolean onlyDigits;

    public TextBox(){
        super();
    }

    @Override
    public void replaceText(int start, int end, String text) {
        String oldText = getText();
        super.replaceText(start, end, text);

        if (!verify()){
            setText(oldText);
        }
    }

    @Override
    public void replaceSelection(String text) {
        String oldText = getText();
        super.replaceSelection(text);

        if (!verify()){
            setText(oldText);
        }
    }

    private boolean verify() {
        String text = getText();

        if (text =="")
            return true;

        if (text.length() > maxLength) {
            return false;
        }
        if (onlyDigits && !Converter.StringToInt(text).isSuccess()){
            return false;
        }

        return true;
    }

    public int getMaxLength() {
        return maxLength;
    }

    public void setMaxLength(int maxLength) {
        if (maxLength >= 0)
            this.maxLength = maxLength;
    }

    public void setOnlyDigits(boolean onlyDigits) {
        this.onlyDigits = onlyDigits;
    }

    public boolean isOnlyDigits() {
        return onlyDigits;
    }
}

使用以下 FXML 时,出现错误:

<TextBox
                GridPane.columnIndex="0" GridPane.rowIndex="1"
                maxLength="2"
                onlyDigits="true"
                fx:id="tbNumberVertex" />

原因:javafx.fxml.LoadException:解析 onlyDigits='true' 时出错,要么事件处理程序不在命名空间中,要么脚本中有错误。

但在 maxLength 的情况下,一切正常

标签: javajavafxfxml

解决方案


我认为这里发生的事情是,因为该属性onlyDigits以 text 开头"on",所以 FXML 解析器假设它是一个事件处理程序属性。(例如,onAction。)所以它假设分配的值,true,是指在 FXML 的脚本中定义的函数。

(对于它的价值,我认为这是一个错误。)

更改属性的名称,例如useOnlyDigits通过更改方法的名称:

public void setUseOnlyDigits(boolean onlyDigits) {
    this.onlyDigits = onlyDigits;
}

public boolean isUseOnlyDigits() {
    return onlyDigits;
}

并相应地更新 FXML:

<TextBox
    GridPane.columnIndex="0" GridPane.rowIndex="1"
    maxLength="2"
    useOnlyDigits="true"
    fx:id="tbNumberVertex" />

推荐阅读