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

标签 java javafx

我正在尝试使用 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/

相关文章:

java - 如何通过JavaFX从Mariadb数据库获取数据到表?

JavaFX:为什么 FilteredList 没有实现 add()?

java - 自动调整 JavaFX TextArea 的宽度

html - JavaFX |搜索并突出显示文本 |为加载的网页添加搜索栏

java - 使用 javaFX 密码字段

java - 如何在另一个方法中返回java中方法的值

java - 如何将总价添加到最终输出中?

java - 如何在java中使用JPEG编解码器加载图片?

java - 使用相同 ID 的 Hibernate DB 对象映射时出错

java - 如何在 Mac OS X 上获取 jdk 源代码