JavaFX 支持滑动滚动吗?

EQv*_*van 5 java javafx

我正处于 Java 应用程序的早期规划阶段,该应用程序将在带有触摸屏的平台上运行,我希望它能够提供您在手机上看到的那种触摸屏支持 - 特别是快速滑动的能力在列表、树或表视图等控件上滑动,使其快速滚动并保持滚动一段时间,即使在滑动结束后也是如此。我研究了一堆 JavaFX 文档,但我仍然不确定是否提供了这种手势支持。谁能证实是这样吗?你能指出示例代码吗?如果没有,谁能建议一种在 Java 中实现这种行为的替代方法?

jew*_*sea 7

ListView如果您只使用标准控件(例如或 ) ,则不需要任何特殊代码TableView,它们将支持开箱即用的惯性滚动行为。

您可以通过以下方式在任何笔记本电脑上尝试:

  • 把很多东西放在一个ListView.
  • 单击 ListView 中的某个项目可将其聚焦。
  • 使用触摸板上的手势向上或向下滚动。
    • 或者,如果您有触摸屏,也可以使用触摸屏来完成同样的事情。
    • 鼠标滚轮也应该可以工作。

示例:ListView 的惯性滚动

这里没有特殊的代码,当给出正确的输入时它“正常工作”。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.stage.Stage;

public class SwipeableListApp extends Application {
    private static final int INIT_LINES = 10_000;

    @Override
    public void start(Stage stage) {
        ListView<String> listView = new ListView<>();
        for (int i = 0; i < INIT_LINES; i++) {
            listView.getItems().add(
                    "Item " + (i+1)
            );
        }

        stage.setScene(new Scene(listView));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

示例:窗格的惯性滚动

如果您想自定义处理滑动手势,例如您正在创建一个水果忍者(强烈建议浪费时间),那么您可以使用标准 Java 事件处理选项(过滤器和处理程序)来编写自定义代码以对手势事件做出反应在 及其子类中具有惯性支持GestureEvent(如用户 EQvan 在评论中所述)。

在 Mac 上并使用触摸板手势进行测试时:

  • 它不会检测滑动事件(我认为它们可能用在平板电脑或手机等实际触摸屏设备上)。
  • 但它会检测触摸板(或鼠标滚轮,尽管我没有滚轮来测试它)生成的滚动事件,这也是一种手势事件。

通过查看输出,您会注意到,在inertia收到滚动完成事件后,滚动事件会继续生成一段时间(事件中设置为 true)。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class SwipeablePaneApp extends Application {
    @Override
    public void start(Stage stage) {
        Pane pane = new Pane();

        pane.setOnSwipeUp(System.out::println);
        pane.setOnSwipeDown(System.out::println);
        pane.setOnSwipeLeft(System.out::println);
        pane.setOnSwipeRight(System.out::println);

        pane.setOnScrollStarted(System.out::println);
        pane.setOnScroll(System.out::println);
        pane.setOnScrollFinished(System.out::println);

        pane.setPrefSize(200, 200);

        stage.setScene(new Scene(pane));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Run Code Online (Sandbox Code Playgroud)