在 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
为此,您必须创建 TableCell
的 updateItem(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();
}
});
演示预览
希望对您有所帮助。
我有一些 TextFieldTableCell
用于获取 Double
数据类型值。我想验证它们。如果用户输入错误的数据类型或将该字段留空,我想将 TextFieldTableCell
标记为
Background color Yello
Text style color Red
验证成功后,我希望 TextFieldTableCell
再次正常。
我怎样才能做到这一点?
好吧,您可以通过多种方式实现,而多种方式与您在 TableCell
中实现它的方式有关,但它主要取决于 DataHolder
Object
你用来帮助 virtualization
为此,您必须创建 TableCell
的 updateItem(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();
}
});
演示预览
希望对您有所帮助。