我的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()
显示正确的行数。如果我向下滚动表格,我会看到突出显示未批准的行。我迷失了一点。
所以问题是如何正确处理我的表的滚动事件?我需要处理表的所有行,而不仅仅是可见的。
答案 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)。