过滤 tableView 在特定列中留下一些数据
Filter a tableView leaves some data in a specific column
我已经用列创建了 table 视图,一切正常。
我刚刚提到的一件事是,当我过滤行时,一些数据保留在我定义了它的 cellFactory 的列中。
显示问题的图片:
列代码:
@FXML
private TableColumn<Log, Integer> colQuanJour;
colQuanJour.setCellValueFactory(new PropertyValueFactory<>("quantite"));
CellFactory 添加颜色和字符(+ 或 -)
colQuanJour.setCellFactory(
new Callback<TableColumn<Log,Integer>,TableCell<Log,Integer>>(){
@Override
public TableCell<Log, Integer> call(TableColumn<Log, Integer> param) {
return new TableCell<Log, Integer>(){
@Override
protected void updateItem(Integer item, boolean empty) {
if( ! empty){
int currIndex = indexProperty().getValue() < 0 ? 0
: indexProperty().getValue();
int operIndex = param.getTableView().getItems().get(currIndex).getOperation().getId_operation();
setStyle("-fx-font-weight: bold");
String Char ;
if(operIndex == 2){
setStyle("-fx-font-size : 16px");
setStyle("-fx-text-fill : red");
Char = "-";
}else {
setStyle("-fx-font-size : 16px");
setStyle("-fx-text-fill : green");
Char = "+";
}
String val = String.valueOf(param.getTableView().getItems().get(currIndex).getQuantite());
setText(Char+val);
}
}
};
}
});
Log 是一个包含 属性 数量 (SimpleIntegerProperty) 的 pojo。
我的table是
TableView<Log> tblart;
过滤函数:
此函数从组合框中获取值来选择要用于过滤的列,默认情况下它从所有 table 中过滤,如下所示:
void filterOneJour(String id,String newVal){
ObservableList<Log> obsList = FXCollections.observableArrayList();
for(Log jour : tblJour.getItems()){
String num = String.valueOf(jour.getNum());
String qte = String.valueOf(jour.
switch(id){
case "Numéro" :
if(num.toUpperCase().contains(newVal))
obsList.add(jour);break;
case "Quantité":
if(qte.toUpperCase().contains(newVal))
obsList.add(jour);break;
default :
if(num.toUpperCase().contains( qte.toUpperCase().contains(newVal) )
obsList.add(jour);
}
}
tblJour.setItems(obsList);
}
所以我希望一切都清楚,我认为问题来自 cellFactory,更准确地说是 updateItem。
是的,如您所述,问题出在 updateItem 方法。 TableView(实际上是 VirtualFlow)通过使用相同的 rows/cells 来呈现以避免性能问题。 row/cell updateItem 将根据提供的项目调用。在您的情况下,您仅在项目存在时添加更新单元格,而在项目为空时忽略它。因此单元格不会为空行更新。
要解决您的问题..您需要添加 else 条件。
colQuanJour.setCellFactory(
new Callback<TableColumn<Log,Integer>,TableCell<Log,Integer>>(){
@Override
public TableCell<Log, Integer> call(TableColumn<Log, Integer> param) {
return new TableCell<Log, Integer>(){
@Override
protected void updateItem(Integer item, boolean empty) {
if( ! empty){
// Your code...
setText(Char+val);
}else{
setText(null); // This will clear the text for empty rows
}
}
};
}
});
我已经用列创建了 table 视图,一切正常。
我刚刚提到的一件事是,当我过滤行时,一些数据保留在我定义了它的 cellFactory 的列中。
显示问题的图片:
列代码:
@FXML
private TableColumn<Log, Integer> colQuanJour;
colQuanJour.setCellValueFactory(new PropertyValueFactory<>("quantite"));
CellFactory 添加颜色和字符(+ 或 -)
colQuanJour.setCellFactory(
new Callback<TableColumn<Log,Integer>,TableCell<Log,Integer>>(){
@Override
public TableCell<Log, Integer> call(TableColumn<Log, Integer> param) {
return new TableCell<Log, Integer>(){
@Override
protected void updateItem(Integer item, boolean empty) {
if( ! empty){
int currIndex = indexProperty().getValue() < 0 ? 0
: indexProperty().getValue();
int operIndex = param.getTableView().getItems().get(currIndex).getOperation().getId_operation();
setStyle("-fx-font-weight: bold");
String Char ;
if(operIndex == 2){
setStyle("-fx-font-size : 16px");
setStyle("-fx-text-fill : red");
Char = "-";
}else {
setStyle("-fx-font-size : 16px");
setStyle("-fx-text-fill : green");
Char = "+";
}
String val = String.valueOf(param.getTableView().getItems().get(currIndex).getQuantite());
setText(Char+val);
}
}
};
}
});
Log 是一个包含 属性 数量 (SimpleIntegerProperty) 的 pojo。
我的table是
TableView<Log> tblart;
过滤函数:
此函数从组合框中获取值来选择要用于过滤的列,默认情况下它从所有 table 中过滤,如下所示:
void filterOneJour(String id,String newVal){
ObservableList<Log> obsList = FXCollections.observableArrayList();
for(Log jour : tblJour.getItems()){
String num = String.valueOf(jour.getNum());
String qte = String.valueOf(jour.
switch(id){
case "Numéro" :
if(num.toUpperCase().contains(newVal))
obsList.add(jour);break;
case "Quantité":
if(qte.toUpperCase().contains(newVal))
obsList.add(jour);break;
default :
if(num.toUpperCase().contains( qte.toUpperCase().contains(newVal) )
obsList.add(jour);
}
}
tblJour.setItems(obsList);
}
所以我希望一切都清楚,我认为问题来自 cellFactory,更准确地说是 updateItem。
是的,如您所述,问题出在 updateItem 方法。 TableView(实际上是 VirtualFlow)通过使用相同的 rows/cells 来呈现以避免性能问题。 row/cell updateItem 将根据提供的项目调用。在您的情况下,您仅在项目存在时添加更新单元格,而在项目为空时忽略它。因此单元格不会为空行更新。
要解决您的问题..您需要添加 else 条件。
colQuanJour.setCellFactory(
new Callback<TableColumn<Log,Integer>,TableCell<Log,Integer>>(){
@Override
public TableCell<Log, Integer> call(TableColumn<Log, Integer> param) {
return new TableCell<Log, Integer>(){
@Override
protected void updateItem(Integer item, boolean empty) {
if( ! empty){
// Your code...
setText(Char+val);
}else{
setText(null); // This will clear the text for empty rows
}
}
};
}
});