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

Events 在TableView上处理ScrollEvent占用了太多的CPU时间,events,javafx,scroll,event-handling,tableview,Events,Javafx,Scroll,Event Handling,Tableview,我有一个名为tablevere的TableView,我想检查每一行的条件(stockcolumn value),并在滚动时对它们执行一些代码,所以我写了这个代码,但这会让程序消耗大量CPU时间,我不熟悉Lambda表达式,所以有没有更简单的方法来写这个 tableVerre.addEventFilter(ScrollEvent.ANY, new EventHandler<ScrollEvent>() { @Override public void handle(Sc

我有一个名为
tablevere
TableView
,我想检查每一行的条件(
stock
column value),并在滚动时对它们执行一些代码,所以我写了这个代码,但这会让程序消耗大量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");
            }
        }
    };
});

            }
     });
tableVerre.addEventFilter(ScrollEvent.ANY,neweventhandler()){
@凌驾
公共无效句柄(ScrollEvent ScrollEvent){
stock.setCellFactory(列->{
返回新的TableCell(){
@凌驾
受保护的void updateItem(数字项,布尔值为空){
super.updateItem(项,空);
TableRow currentRow=getTableRow();
if(空| |项==null){
setText(“”);
设置图形(空);
currentRow.setStyle(tableVerre.getStyle());
}否则{
setText(getItem().toString());
}
如果(!isEmpty()){
如果((int)item==0&&st.getVerresBOX())currentRow.setStyle(“-fx背景色:lightcoral”);
}
}
};
});
}
});

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

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

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

TableColumn-stock;
// ...
stock.setCellFactory(列->新表单元格(){
@凌驾
受保护的void updateItem(数字项,布尔值为空){
super.updateItem(项,空);
TableRow currentRow=getTableRow();
if(空| |项==null){
setText(“”);
设置图形(空);
currentRow.setStyle(tableVerre.getStyle());
}否则{
setText(getItem().toString());
}
如果(!isEmpty()){
if(item.intValue()==0&&st.getVerresBOX()){
currentRow.setStyle(“-fx背景色:淡珊瑚”);
}否则{
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(MouseEvent.MOUSE_单击(
MouseEvent事件)->
{
if((event.getTarget()instanceof TableColumnHeader)| event.isDragDetect()){
System.err.println(“鼠标拖动:+event.toString());
stock.setCellFactory((TableColumn列)->{
返回新的TableCell(){
@凌驾
受保护的void updateItem(数字项,布尔值为空){
super.updateItem(项,空);
TableRow currentRow=getTableRow();
if(空| |项==null){
setText(“”);
设置图形(空);
currentRow.setStyle(tableVerre.getStyle());
}否则{
setText(getItem().toString());
}
如果(!isEmpty()){
if((int)item==0&&st.getVerresBOX()){
currentRow.setStyle(“-fx背景色:淡珊瑚”);
}
}
}
};
});
}
});
第二个将使用键盘键向下/向上处理滚动

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());
    }
});
tableVerre.addEventFilter(按下KeyEvent.KEY\u,新建EventHandler()){
@凌驾
公共无效句柄(KeyEvent事件){
if(event.getCode()==KeyCode.DOWN | event.getCode()==KeyCode.UP){
stock.setCellFactory(列->{
返回新的TableCell(){
@凌驾
受保护的void updateItem(数字项,布尔值为空){
super.updateItem(项,空);
TableRow currentRow=getTableRow();
if(空| |项==null){
setText(“”);
设置图形(空);
currentRow.setStyle(tableVerre.getStyle());
}否则{
setText(getItem().toString());
}
如果(!isEmpty()){
if((int)item==0&&st.getVerresBOX()){
currentRow.setStyle(“-fx背景色:淡珊瑚”);
}
}
}
};
});
}
System.err.println(“按键:+event.toString());
}
});

为什么要替换滚动处理程序中的
cellFactory
?可能是
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());
    }
});