Получить событие прокрутки из ScrollBar, даже если значение равно 0 или 1,0 - PullRequest
0 голосов
/ 12 марта 2019

Я хотел бы получать уведомления о событии прокрутки в TableView.

В настоящее время у меня есть это:

    scrollBar = (ScrollBar) tableView.lookup(".scroll-bar:vertical");
    scrollBar.valueProperty().addListener((observable, oldValue, newValue) -> {
    System.err.println(newValue);
    if ((newValue != null) && ((Double) newValue == 0.0)) {
        addMoreDataTop(4);
    }
    if ((newValue != null) && ((Double) newValue == 1.0)) {
        addMoreDataBottom(4);
    }
    });

Это прекрасно работает, если новое значение находится между 0и 1,0 (пока значение меняется).

Но я особенно заинтересован в scrollEvents"на краю" списка, это означает , когда значение прокрутки равноуже 0 или 1,0 .

Значение свойства больше не изменяется, поэтому слушатели не уведомляются.Но свиток (намерение) происходит в любом случае.Могу ли я получать уведомления о таких событиях прокрутки, которые не изменяют прокрутку списка / таблицы?

1 Ответ

2 голосов
/ 13 марта 2019

На основании комментария Слава я придумал следующее:

tableView.setOnScroll(e -> {
    if (e.getDeltaY() > 0) {
    fillAtTop();
    } else if (e.getDeltaY() < 0) {
    fillAtBottom();
    }
});

Это работает так, как задумано, поскольку полоса прокрутки tableView будет использовать события прокрутки, которые изменяют состояние прокрутки таблицы.

Зарегистрированный слушатель будет вызываться только тогда, когда полоса прокрутки не изменится (больше).

Я использую это для ленивой загрузки содержимого таблицы, когда пользователь прокручивает до начала или конца таблицы.

Вот извлеченный MWE:

public class MainApp extends Application {

    final AtomicInteger cnt = new AtomicInteger(0);
    final ObservableList<String> content = FXCollections.observableArrayList();

    public static void main(final String[] args) {

    launch(args);
    }

    @Override
    public void start(final Stage primaryStage) throws Exception {
    preFillContent();
    final TableView<String> tableView = new TableView<>();
    final TableColumn<String, String> c1 = new TableColumn<>("C1");
    c1.setCellValueFactory(e -> new ReadOnlyObjectWrapper<>(e.getValue().toString()));
    tableView.getColumns().add(c1);
    tableView.setItems(content);
    tableView.setOnScroll(e -> {   
    if (e.getDeltaY() > 0) {
    fillAtTop();
    } else if (e.getDeltaY() < 0) {
    fillAtBottom();
    }
    });
    final StackPane root = new StackPane();
    root.getChildren().add(tableView);
    primaryStage.setScene(new Scene(root, 300, 250));
    primaryStage.show();
    }

    private void preFillContent() {
    for (int i = 0; i < 10; i++) {
        content.add("element " + cnt.incrementAndGet());
    }
    }

    private void fillAtBottom() {
    content.add("element " + cnt.incrementAndGet());
    }

    private void fillAtTop() {
    content.add(0, "element " + cnt.incrementAndGet());
    }
}
...