在 JavaFX 中为 TextFieldTableCell 创建有效性检查

Create A Validity Check For TextFieldTableCell in JavaFX

我有一些 TextFieldTableCell 用于获取 Double 数据类型值。我想验证它们。如果用户输入错误的数据类型或将该字段留空,我想将 TextFieldTableCell 标记为

Background color Yello

Text style color Red

验证成功后,我希望 TextFieldTableCell 再次正常。

我怎样才能做到这一点?

好吧,您可以通过多种方式实现,而多种方式与您在 TableCell 中实现它的方式有关,但它主要取决于 DataHolder Object 你用来帮助 virtualization

为此,您必须创建 TableCellupdateItem(Object,boolean) 来实现单元格关于样式等的更新,并且它应该与您的 updateSelected(boolean) 即使一个调用另一个,或者离开两个并使用 updateIndex() 所以像这样的东西给你的 DataHolder class

private class CellDataHolder {

    public CellDataHolder (String a){
        value = a;
    }

    String value = "empty"; //this being the text to show
    boolean badMatch = false; //this being the flag to index whether the
    //text matches your preference
}

现在在您的单元格中,使用上述方法之一为您的项目添加支票

@Override
    public void updateItem(CellDataHolder item, boolean empty) {
        super.updateItem(item, empty);
        if(empty){return;}
        setText(item.value);//set your text
        if(item.badMatch){//check if the text fits.
            setStyle(wrongFormatStyle);//this is where you set your bad style
        }else{
            setStyle(normalyStyle);//the style you want
        }
    }

然后在你的 StringConverter 中你将使用它来检查你的文本是否有效我认为你应该使用 StringConverter 的原因是它可以减少多次调用 update...() 接收,这些方法被调用了太多次,在那里做大量的工作并不酷,你的单元格可能看起来很慢,所以你最好把它放在这里,例如

setConverter(new StringConverter<CellDataHolder>() {
            @Override
            public String toString(CellDataHolder arg0) {
                    arg0.badMatch =
                            arg0.value.matches(".*[a-zA-Z]+.*");//here you add your algorithm
                return arg0.value;
            }

            @Override
            public CellDataHolder fromString(String arg0) {
                getItem().value = arg0;
                return getItem();
            }
        });

您还可以过滤调用检查时的过滤方式,无论是调用刷新还是进行显式编辑。例如

setConverter(new StringConverter<CellDataHolder>() {
            @Override
            public String toString(CellDataHolder arg0) {
                 if(isEditing()){ //whether it is an edit
                    arg0.badMatch =
                            arg0.value.matches(".*[a-zA-Z]+.*");//here you add your algorithm
                 }
                return arg0.value;
            }

            @Override
            public CellDataHolder fromString(String arg0) {
                getItem().value = arg0;
                return getItem();
            }
        });

这是一个full demo snippet

演示预览

希望对您有所帮助。