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

时间:2017-03-26 20:27:44

标签: events javafx scroll event-handling tableview

我有一个名为TableView的{​​{1}},我想让它的每一行检查一个条件(tableVerre列值)并在滚动时对它们执行一些代码,所以我写了这段代码,但是它会让程序耗费大量的CPU时间,我不熟悉Lambda表达式,所以有更简单的方法来编写吗? :

stock

2 个答案:

答案 0 :(得分:2)

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

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

另请注意,您应该"转换"通过致电NumberintintValue()

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());
            }
        }
    }
});

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

答案 1 :(得分:1)

首先,除了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());
    }
});