在 TableView 上处理 ScrollEvent 会占用太多的 CPU 时间



我有一个名为 tableVerreTableView,我想检查它的每一行都有一个条件(stock列值(,并在我滚动时对它们执行一些代码,所以我写了这段代码,但它使程序消耗大量 CPU 时间,我不熟悉 Lambda 表达式,所以有没有更简单的方法来编写这个?

tableVerre.addEventFilter(ScrollEvent.ANY, new EventHandler<ScrollEvent>() {
    @Override
    public void handle(ScrollEvent scrollEvent) {
    stock.setCellFactory(column -> {
    return new TableCell<VerreFX, Number>() {
        @Override
        protected void updateItem(Number item, boolean empty) {
        super.updateItem(item, empty);
            TableRow<VerreFX> currentRow = getTableRow();
            if (empty || item == null) {
                setText("");
                setGraphic(null);
               currentRow.setStyle(tableVerre.getStyle());
            } else {
                setText(getItem().toString());
            }
            if (!isEmpty()) {
                if ((int) item == 0 && st.getVerresBOX()) currentRow.setStyle("-fx-background-color:lightcoral");
            }
        }
    };
});
            }
     });

表视图将在用户滚动时重用单元格,并在单元格重新用于新项目时自动调用单元格上的updateItem。因此,您应该只设置一次单元工厂,然后让表视图负责完成它设计要执行的工作。如果您使用的是 FXML,则可以在 initialize() 方法中设置单元工厂,或者只需在创建表和列的任何位置设置单元工厂。

您的单元格实现并不完全正确:因为一个单元格可以重复使用以任意显示任何两个不同的项目,因此您需要考虑所有可能的条件。在您的实现中,如果单元格显示item.intValue()==0的项目,然后重用以显示item.intValue() != 0的项目,则样式将无法正确更新。

另请注意,您应该通过调用 intValue()Number"转换"为int

TableColumn<VerreFX, Number> stock ;
// ...
stock.setCellFactory(column -> new TableCell<VerreFX, Number>() {
    @Override
    protected void updateItem(Number item, boolean empty) {
        super.updateItem(item, empty);
        TableRow<VerreFX> currentRow = getTableRow();
        if (empty || item == null) {
            setText("");
            setGraphic(null);
           currentRow.setStyle(tableVerre.getStyle());
        } else {
            setText(getItem().toString());
        }
        if (!isEmpty()) {
            if (item.intValue() == 0 && st.getVerresBOX()) {
                currentRow.setStyle("-fx-background-color:lightcoral");
            } else {
                currentRow.setStyle(tableVerre.getStyle());
            }
        }
    }
});

您应该能够完全删除滚动事件处理程序。

首先,

除了使用CPU时间之外,您并没有涵盖所有滚动情况,因为如果用户使用键向下/向上或使用滚动条滚动,则不会触发滚动事件。所以你必须再添加两个EventFilter,第一个将使用滚动条处理滚动。

tableVerre.addEventFilter(MouseEvent.MOUSE_CLICKED,(
            MouseEvent event)->
    {
        if ((event.getTarget() instanceof TableColumnHeader) | event.isDragDetect()) {
            System.err.println("Mouse Draged : " + event.toString());
            stock.setCellFactory((TableColumn<VerreFX, Number> column) -> {
                return new TableCell<VerreFX, Number>() {
                    @Override
                    protected void updateItem(Number item, boolean empty) {
                        super.updateItem(item, empty);
                        TableRow<VerreFX> currentRow = getTableRow();
                        if (empty || item == null) {
                            setText("");
                            setGraphic(null);
                            currentRow.setStyle(tableVerre.getStyle());
                        } else {
                            setText(getItem().toString());
                        }
                        if (!isEmpty()) {
                            if ((int) item == 0 && st.getVerresBOX()) {
                                currentRow.setStyle("-fx-background-color:lightcoral");
                            }
                        }
                    }
                };
            });
        }
    });

第二个将使用键盘键向下/向上处理滚动。

tableVerre.addEventFilter(KeyEvent.KEY_PRESSED,new EventHandler<KeyEvent>(){
    @Override
    public void handle(KeyEvent event) {
        if (event.getCode() == KeyCode.DOWN | event.getCode() == KeyCode.UP) {
            stock.setCellFactory(column -> {
                return new TableCell<VerreFX, Number>() {
                    @Override
                    protected void updateItem(Number item, boolean empty) {
                        super.updateItem(item, empty);
                        TableRow<VerreFX> currentRow = getTableRow();
                        if (empty || item == null) {
                            setText("");
                            setGraphic(null);
                            currentRow.setStyle(tableVerre.getStyle());
                        } else {
                            setText(getItem().toString());
                        }
                        if (!isEmpty()) {
                            if ((int) item == 0 && st.getVerresBOX()) {
                                currentRow.setStyle("-fx-background-color:lightcoral");
                            }
                        }
                    }
                };
            });
        }
        System.err.println("Key Pressed : " + event.toString());
    }
});

相关内容

  • 没有找到相关文章

最新更新