gpt4 book ai didi

java - onScroll 监听器在 JavaFX 2 的 TableView 中不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 06:47:28 30 4
gpt4 key购买 nike

我正在尝试使用 TableView 组件的 onScroll 事件监听器:

FXML:

<TableView fx:id="table" onScroll="#doSomething" tableMenuButtonVisible="true" VBox.vgrow="ALWAYS">
<columnResizePolicy>
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
</columnResizePolicy>
</TableView>

Java Controller :

@FXML
void doSomething(ActionEvent event)
{
System.out.println("Object: " + event.getSource());
}

但是它不起作用!我做错了什么?

我需要捕获垂直滚动条来手动控制滚动位置并根据向下或向上滚动来获取相关数据。

谢谢大家!

最佳答案

我认为可能发生的情况是 TableView 本身正在消耗滚动事件并在内部处理它,因此它永远不会到达您的应用程序处理程序。

最初,我认为您可能想使用 onScrollTo而不是onScroll ,但这似乎并没有真正解决问题。

我认为有效的解决方案是在滚动事件上应用过滤器。

此外,您可以编写使用 scrollTo 的代码调用“手动控制滚动位置”。

以下是一些您可以尝试的示例代码 (Java 8):

TableScrollerApp.java

package finder;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Group;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class TableScrollerApp extends Application {
@Override public void start(final Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader(
getClass().getResource("tablescroller.fxml")
);
Parent parent = loader.load();

stage.setScene(new Scene(new Group(parent)));
stage.show();
}

public static void main(String[] args) {
Application.launch(args);
}
}

TableScrollerController.java

package finder;

import javafx.beans.property.ReadOnlyStringProperty;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.fxml.FXML;
import javafx.scene.control.ScrollToEvent;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.ScrollEvent;

import java.util.Arrays;
import java.util.stream.Collectors;

public class TableScrollerController {
private static final String[] fruitNames = {
"apples", "oranges", "pears", "peaches",
"guavas", "bananas", "jackfruit", "durians"
};

@FXML
private TableView<Fruit> fruitsTable;

@FXML
private TableColumn<Fruit, String> fruitsColumn;

@FXML
protected void initialize() {
fruitsColumn.setCellValueFactory(new PropertyValueFactory<>("name"));

fruitsTable.addEventFilter(ScrollEvent.ANY, event ->
System.out.println("Coded scroll filter: " + event)
);

fruitsTable.getItems().setAll(
Arrays.stream(fruitNames)
.map(Fruit::new)
.collect(Collectors.toList())
);

fruitsTable.scrollTo(5);
}

@FXML
protected void onScrollHandler(ScrollEvent scrollEvent) {
System.out.println("FXML referenced scroll handler: " + scrollEvent);
}

@FXML
protected void onScrollToHandler(ScrollToEvent<Integer> scrollToEvent) {
System.out.println("FXML referenced onScroll handler: " + scrollToEvent);
}

public static class Fruit {
private ReadOnlyStringWrapper name;

public Fruit(String name) {
this.name = new ReadOnlyStringWrapper(name);
}

public String getName() {
return name.get();
}

public ReadOnlyStringProperty nameProperty() {
return name;
}
}
}

tablescroller.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>

<TableView fx:id="fruitsTable"
maxHeight="-Infinity" maxWidth="-Infinity"
minHeight="-Infinity" minWidth="-Infinity"
onScroll="#onScrollHandler"
onScrollTo="#onScrollToHandler"
prefHeight="100.0" prefWidth="250.0"
xmlns="http://javafx.com/javafx/8"
xmlns:fx="http://javafx.com/fxml/1"
fx:controller="finder.TableScrollerController">
<columns>
<TableColumn fx:id="fruitsColumn"
maxWidth="800.0" minWidth="200.0" prefWidth="-1.0"
text="Fruits" />
</columns>
</TableView>

关于java - onScroll 监听器在 JavaFX 2 的 TableView 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23789525/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com