JavaFX滚动事件处理TableView

Ole*_*leg 1 javafx-2

我的JavaFX项目有问题.有一刻我无法理解.据我所知,以下代码应该能够处理表的所有滚动事件,这是TableView的一个实例

        table.setOnScroll(new EventHandler<ScrollEvent>() {
            @Override
            public void handle(ScrollEvent scrollEvent) {
                System.out.println("Hello!");
                int i = 0;
                int length = table.getItems().size();
                for(Node n: table.lookupAll("TableRow")) {
                    if (n instanceof TableRow) {
                        TableRow row = (TableRow) n;
                        if(table.getItems().get(i).getType() == "fwfx") {                    
                            row.setStyle("-fx-background-color: forestgreen;");
                        }
                        i++;
                    }
                    if(i == length) {
                        break;
                    }
                }
            }
        }
    );
Run Code Online (Sandbox Code Playgroud)

每当我启动应用程序时,它只会为可见行正确突出显示行.我发现它是因为

table.lookupAll("TableRow")
Run Code Online (Sandbox Code Playgroud)

为我返回仅17个节点的集合.虽然

table.getItems().size()
Run Code Online (Sandbox Code Playgroud)

显示正确的行数.如果我向下滚动表格,我会看到突出显示未批准的行.我迷失了一点.

所以问题是如何正确处理我的表的滚动事件?我需要处理表的所有行,而不仅仅是可见的.

Ole*_*leg 6

最后我找到了处理滚动事件的方法,我想分享一下我的经验.使用Scenic View我发现只有当光标在列标题上滚动鼠标滚轮时才会触发TableView setOnScroll事件.但是当光标位于表数据之上时(能够在我的示例中需要),能够处理ScrollEvent,需要使用EventFilter来确定.例如,下面的colde将处理TableView实例的所有滚动事件

    table.addEventFilter(ScrollEvent.ANY, new EventHandler<ScrollEvent>() {
            @Override
            public void handle(ScrollEvent scrollEvent) {
               System.out.println("Scrolled.");
            }
     });
Run Code Online (Sandbox Code Playgroud)

Scenic View也给了我一个关于TableView包含的内容的提示

stage.show()
Run Code Online (Sandbox Code Playgroud)

工作.

Althougth我仍然错误地突出显示行)...