JavaFX滚动事件处理TableView

时间:2012-11-02 16:02:10

标签: 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;
                    }
                }
            }
        }
    );

每当我启动应用程序时,它只会为可见行正确突出显示行。我找到了它是因为

table.lookupAll("TableRow")

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

table.getItems().size()

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

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

3 个答案:

答案 0 :(得分:5)

所以最后我找到了处理滚动事件的方法,我想分享一下我的经验。使用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.");
            }
     });

Scenic View也给了我关于TableView在

之后的内容的提示
stage.show()

已经有效了。

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

答案 1 :(得分:1)

收听滚动条值更改

for (Node node : dataTable.lookupAll(".scroll-bar"))
{
    if  (node instanceof ScrollBar && ((ScrollBar) node).getOrientation().equals(Orientation.VERTICAL))
    {
        ((ScrollBar) node).valueProperty().addListener(formatBUIScrollChangeEventHandler);
    }
}

这将以任何形式的滚动方式触发。

在解决我自己的情况时,花了好几个小时才终于出现了这个想法。

答案 2 :(得分:0)

问题是陈旧的,但您还没有发布/接受答案。

所以,这可以帮助:tableView.refresh()。自Java 8u60以来,它在JavaFX中可用。

您必须在ScrollEvent中调用它。也许可以通过排序和拖动ScrollBar(参见我的回答here)。