1

我的 JavaFX 项目有问题。有一瞬间我无法理解。据我了解,以下代码应该能够处理table的所有滚动事件,它是 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()

显示正确的行数。如果我向下滚动表格,我会看到突出显示的不适当的行。我有点迷路了。

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

4

3 回答 3

9

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

已经奏效了。

尽管我仍然有错误突出显示的行)...

于 2012-11-05T12:41:42.180 回答
1

监听滚动条值变化

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

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

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

于 2015-02-09T19:38:58.430 回答
0

这个问题很老,但您还没有发布/接受答案。

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

您必须在 ScrollEvent 中调用它。也可能通过排序和拖动 ScrollBar (请参阅我的答案here)。

于 2016-11-16T07:25:26.293 回答