里面的TableView滚动文本字段后的JavaFX了(TextField inside Table

2019-10-29 05:33发布

我有一个表视图,它里面有充满文本字段一列。

还有,当我有一些数据,我的表没有滚动条没有问题,出现在所有的TextField。

问题是,当我向下滚动,我的表,然后再上升,一些TextField的缺失。

这里是我的充满文本字段列代码:

purchaseQtyCol.setCellFactory(
                new Callback<TableColumn< TransactionModel, TextField>, TableCell< TransactionModel, TextField>>() {
                    @Override
                    public TableCell< TransactionModel, TextField> call(final TableColumn< TransactionModel, TextField> p) {
                        TableCell<TransactionModel, TextField> cell = new TableCell<TransactionModel, TextField>() {


                            @Override
                            public void updateItem(TextField item, boolean empty) {
                                super.updateItem(item, empty);
                                if (item != null) {
                                    /**
                                     * for(CheckBox cbb : canceledCB) {
                                     * if(item.equals(cbb))
                                     * System.out.println("aa" +
                                     * this.indexProperty().getValue() + " " +
                                     * item.isSelected() ); }*
                                     */
                                    this.setGraphic(item);
                                }

                            }

                        };

                        cell.setAlignment(Pos.CENTER);
                        return cell;
                    }
                });

        purchaseQtyCol.setCellValueFactory(new Callback<CellDataFeatures<TransactionModel, TextField>, ObservableValue<TextField>>() {
            @Override
            public ObservableValue<TextField> call(final CellDataFeatures<TransactionModel, TextField> p) {

                    System.out.println("new textfield");
                    final TextField qtyField = new TextField() {
                        @Override
                        public void replaceText(int start, int end, String text) {

                            if (text.matches("[0-9]") || text.equals("")) {
                                super.replaceText(start, end, text);
                                if (this.getText().isEmpty()) {
                                    p.getValue().setPurchaseQty(0);
                                    p.getValue().setTotalPrice(0);
                                } else {
                                    p.getValue().setPurchaseQty(Integer.parseInt(this.getText()));
                                    p.getValue().setTotalPrice(p.getValue().purchaseQtyProperty().intValue() * p.getValue().basePriceProperty().intValue());
                                }
                                recountTotals();
                            }
                        }

                        @Override
                        public void replaceSelection(String text) {

                            if (text.matches("[0-9]") || text.equals("")) {
                                super.replaceSelection(text);
                                if (this.getText().isEmpty()) {
                                    p.getValue().setPurchaseQty(0);
                                    p.getValue().setTotalPrice(0);
                                } else {
                                    p.getValue().setPurchaseQty(Integer.parseInt(this.getText()));
                                    p.getValue().setTotalPrice(p.getValue().purchaseQtyProperty().intValue() * p.getValue().basePriceProperty().intValue());
                                }
                                recountTotals();
                            }
                        }
                    };

                    qtyField.setText("" + p.getValue().purchaseQtyProperty().getValue());
                    qtyField.setAlignment(Pos.CENTER_RIGHT);

                return new SimpleObjectProperty(qtyField);
            }
        });

我真的很感激,从你们的帮助。

问候,

Chrisma Andhika

Answer 1:

Chrisma! 你所面临的问题是JavaFX的有关tableview中更新项目一个著名的问题。 已经有一些关于它的解决方法,例如在这里 。 解决的办法是通过引发的tableview的内部更新机制

tableview.getColumns().get(0).setVisible(false);
tableview.getColumns().get(0).setVisible(true);

但据我可以理解这种解决方案只影响数据的变化,而不是tableview中的节点的风格。

我也用

@Override
public void updateItem(Object item, boolean empty)

我的执行,但它是不够的,因为当时有一个表和滚动条行太多,出现行的更新成为一个绝对的混乱。

我需要的是要强调satifying通过使用CSS的一些标准所有列。 我实现了以下列方式:

Callback<TableView<Person>, TableRow<Person>> callBack = 
    new Callback<TableView<Person>, TableRow<Person>>() {
        @Override
        public TableRow<Person> call(TableView<Person> tableView) {
              final TableRow<Person> row = new TableRow<Person>() {
                     @Override
                     public void updateItem(Person item, boolean empty) {
                          super.updateItem(item, empty);
                          if(!empty && item.getFirstName() == "John") {
                              getStyleClass().add("john");
                          }
                     }
               };
               row.visibleProperty().addListener(new ChangeListener() {
                     @Override
                     public void changed(ObservableValue observableValue, Object t, Object t1) {
                         Boolean oldValue = (Boolean)t;
                         Boolean newValue = (Boolean)t1;
                         if(oldValue && !newValue) {
                             row.getStyleClass().remove("john");
                         }
                         if(!oldValue && newValue) {
                             if(row.getItem().getFirstName() == "John")
                                 row.getStyleClass().add("john");
                         }
                     }
               });
               return row;
        }
};
tableview.setRowFactory(callBack);

CSS文件应包含以下行:

.john {
-fx-background-color: forestgreen;
-fx-text-fill: white;
-fx-border-style: solid;
}

当然,你可以选择行的不同造型。

Person类应包含

public SimpleStringProperty firstNameProperty() {
    return firstName;
}

正如你可以看到我添加侦听到VisibleProperty一排,在这里我控制每一行的CSS行为。 也许这样的想法可以帮助解决数据更新中的tableview在某些情况下,不只是行造型。

我应该ASLO补充一点,我开始接受了NullPointerExceptionpublic void changed在上述方法的代码,但它不会影响我PROGRAMM的结果。

我希望它会帮助你,Chrisma! 而其他人也!



Answer 2:

我刚刚与复选框这个问题。 他们当我滚动我的大桌子快速随机dissapeared。 我解决它只是通过删除我的cellFactory这一行:

   @Override
    public void updateItem(Boolean item, boolean empty) {
        super.updateItem(item, empty);
       if (empty) {
           setText(null);
           // setGraphic(null); (This line causes weird behaviour in scrolling, delete it)
        } else {
            checkBox.setSelected(item);
        }
    }


Answer 3:

嗯,我也有同样的问题,显然只绘制可见的文本字段,当我们用滚动不会出现,因为只有绘制现场,但不是textinputcontrol,所以我的解决办法是捕捉滚动事件,当你使用它以调整文本框,并返回到原来的大小,从而迫使你重新绘制对象,现在textinputcontrol.forcing出现重绘对象,现在textinputcontrol出现。

 tableview.addEventFilter(ScrollEvent.ANY, new EventHandler<ScrollEvent>() {
        @Override
        public void handle(ScrollEvent scrollEvent) {
           System.out.println("Scrolled.");
            for(ObservableList<TextField> i:data)
                   {
                     for(TextField j: i)
                     {
                   j.setPrefSize(141, 31);
                   j.setPrefSize(140, 30);
                     }
                   }
        }
 });


文章来源: TextField inside TableView gone after scroll JavaFX