【问题标题】:JavaFX: EventFilter for two (different) events at the same timeJavaFX:同时处理两个(不同)事件的事件过滤器
【发布时间】:2021-06-09 09:26:42
【问题描述】:

有没有办法同时处理MouseEvent.MOUSE_PRESSED 事件和ScrollEvent.ANY?我想在触发两个事件时做出反应。目前鼠标按下时,滚动不生效。

public class HorizonScroll extends Application {

    public final int SCENE_WIDTH = 800;
    public final int SCENE_HEIGHT = 600;

    @Override
    public void start(Stage stage) {
        Pane root = new Pane();
        ScrollPane scrollPane = new ScrollPane();
        scrollPane.setPrefSize(100,600);
        scrollPane.setHmax(1000);
        scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS);



        scrollPane.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> {
            System.out.println("Pressed");
        });


        scrollPane.addEventFilter(MouseEvent.MOUSE_RELEASED, e -> {
            System.out.println("Released");
        });

        scrollPane.addEventFilter(ScrollEvent.ANY, e -> {
            System.out.println("Scrolling");

        });

        

        Scene scene = new Scene(root, SCENE_WIDTH, SCENE_HEIGHT);
        stage.setTitle("HorizonScroll");
        stage.setScene(scene);
        root.getChildren().addAll(scrollPane);


        stage.show();
    }

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


这是我现在的假人。我想要实现的是:

...

scrollPane.addEventFilter(Inputevent.ANY, e -> {
     if(e.getEventType() == SCROLL && e.getEventType() == MOUSE_PRESSED) {
      //scrollPane.setHvalue( + 10 or whatever)

所以我想在按下鼠标按钮的同时使用鼠标滚轮实现水平滚动。 提前致谢!

【问题讨论】:

  • 据我所知,您必须自己编写代码(例如,通过在按下/释放时切换一些标志)。嗯..你想达到什么目的?
  • 似乎一个节点一次只能处理一个事件。我想在点击时水平滚动。
  • 我想在点击时水平滚动不明白你的意思 - 所以和往常一样的过程:minimal reproducible example 请:)
  • @kleopatra 我发布了我的代码被剪断了。希望这能更好地描述我的问题。
  • 按照建议,只需在鼠标按下/释放时设置/取消设置标志,并在滚动事件处理程序中检查它。 FWIW,我只使用触控板,我认为您在此处实现的功能无法使用触控板执行。

标签: javafx event-handling mouseevent


【解决方案1】:

事件处理程序一次触发一个事件,并且事件只能是一种类型。为了做你想做的事,你需要建立某种State,然后通过事件处理程序将其关闭和打开。由于您已经捕获了MOUSE_PRESSED 和MOUSE_RELEASED,因此最容易将“是否按下鼠标按钮”作为状态。然后检查事件处理程序中的状态以进行滚动。

像这样:

public class HorizonScroll extends Application {

    public final int SCENE_WIDTH = 800;
    public final int SCENE_HEIGHT = 600;
    private BooleanProperty mousePressed = new SimpleBooleanProperty(false);

    @Override
    public void start(Stage stage) {
        ScrollPane scrollPane = new ScrollPane();
        scrollPane.setPrefSize(100, 600);
        scrollPane.setHmax(1000);
        scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS);
        scrollPane.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> {
            mousePressed.set(true);
            System.out.println("Pressed");
        });

        scrollPane.addEventFilter(MouseEvent.MOUSE_RELEASED, e -> {
            mousePressed.set(false);
            System.out.println("Released");
        });

        scrollPane.addEventFilter(ScrollEvent.ANY, e -> {
            if (mousePressed.get()) {
                System.out.println("Scrolling - pressed");
            } else {
                System.out.println("Scrolling - not pressed");
            }
        });

        stage.setTitle("HorizonScroll");
        stage.setScene(new Scene(new Pane(scrollPane), SCENE_WIDTH, SCENE_HEIGHT));
        stage.show();
    }

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

我要补充一点,我可以触发滚动事件处理程序的唯一方法是使用鼠标上的滚轮。单击滚动条并拖动它不会触发事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多