如果你使用Java 10 +你可以子类
TableViewSkin
并访问
VirtualFlow
. 后一类有
position
属性,可用于确定是否已到达顶部或底部。
下面是使用自定义事件的示例:
MyEndo.java
import javafx.event.Event;
import javafx.event.EventType;
public class MyEvent extends Event {
public static final EventType ANY = new EventType<>(Event.ANY, "MY_EVENT");
public static final EventType TOP_REACHED = new EventType<>(ANY, "TOP_REACHED");
public static final EventType BOTTOM_REACHED = new EventType<>(ANY, "BOTTOM_REACHED");
public MyEvent(EventType extends MyEvent> eventType) {
super(eventType);
}
}
myTableViewSkin.java
import javafx.scene.control.TableView;
import javafx.scene.control.skin.TableViewSkin;
public class MyTableViewSkin extends TableViewSkin {
public MyTableViewSkin(TableView control) {
super(control);
getVirtualFlow().positionProperty().addListener((obs, oldVal, newVal) -> {
if (newVal.doubleValue() == 0.0) {
control.fireEvent(new MyEvent(MyEvent.TOP_REACHED));
} else if (newVal.doubleValue() == 1.0) {
control.fireEvent(new MyEvent(MyEvent.BOTTOM_REACHED));
}
});
}
}
App.java
import javafx.application.Application;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;
public class App extends Application {
@Override
public void start(Stage primaryStage) {
var table = new TableView();
for (int i = 0; i < 250; i++) {
table.getItems().add(i);
}
var column = new TableColumn("Value");
column.setCellValueFactory(features -> new SimpleIntegerProperty(features.getValue()));
table.getColumns().add(column);
table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
table.setSkin(new MyTableViewSkin<>(table));
table.addEventHandler(MyEvent.ANY, event -> System.out.printf("%s%n", event.getEventType()));
primaryStage.setScene(new Scene(table, 500, 300));
primaryStage.setTitle("Example");
primaryStage.show();
}
}
在这个例子中,我手动调用
table.setSkin
. 另一种选择是子类
TableView
超驰
createDefaultSkin
它返回您想要使用的皮肤。