【问题标题】:How to send events from one Node to another Node如何将事件从一个节点发送到另一个节点
【发布时间】:2013-04-26 19:56:46
【问题描述】:

我有一个监听滚轮鼠标滚动的窗格;我还有一个滚动条,它会自动监听滚轮鼠标滚动。我想知道如何将窗格捕获的滚动事件发送到滚动条。

我不能使用滚动窗格,因为我需要窗格的自定义实现,我已经尝试使用滚动窗格,但它不能满足我的需求。

我尝试触发事件和其他方法,但我只能将事件传递/传播/发送到滚动条。

提前致谢

示例应用程序:

package com.test;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.geometry.Orientation;
import javafx.scene.Scene;
import javafx.scene.control.ScrollBar;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class ScrollTest extends Application{

   @Override
   public void start(Stage primaryStage) throws Exception {


     final BorderPane root = new BorderPane();

     final Pane pane = new Pane();
     root.setCenter(pane);

     final ScrollBar scrollBar = new ScrollBar();
     root.setRight(scrollBar);


     pane.addEventFilter(ScrollEvent.ANY, new EventHandler<ScrollEvent>(){
        @Override
        public void handle(ScrollEvent arg0) {
           System.out.println("scrolling on the pane");

           Event.fireEvent(scrollBar, arg0);
//           scrollBar.getEventDispatcher().dispatchEvent(arg0, arg1)
        }
     });



     scrollBar.setOrientation(Orientation.VERTICAL);
     scrollBar.valueProperty().addListener(new ChangeListener<Number>() {
        @Override
        public void changed(ObservableValue<? extends Number> ov, Number old_val, final Number new_val) {
           System.out.println("scrollBar.valueProperty() changed");
        }
     });


     primaryStage.setScene(new Scene(root, 600, 600));
     primaryStage.show();
   }

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

}

【问题讨论】:

    标签: javafx-2


    【解决方案1】:

    看来,您的问题等于需要自定义滚动窗格实现。

    我认为,一种可能的方法是解析事件,并在事件发生时使滚动条更改其值(在窗格上的事件上添加侦听器,解析向上或向下滚动,并使用滚动的增量或减量方法条)。

    此外,我们使用一些实现来发送滚动事件。在你的实现中使用这个从头开始:

    /**
     * Send ScrollEvent in the center of the control
     *
     * @param wrap Wrap, which will receive event
     * @param scrollX Number of pixels to scroll by x coordinate
     * @param scrollY Number of pixels to scroll by y coordinate
     */
    protected static void sendScrollEvent(final Scene scene, Node node, double scrollX, double scrollY) {
        double x = node.getLayoutBounds().getWidth() / 4;
        double y = node.getLayoutBounds().getHeight() / 4;
        sendScrollEvent(scene, node, scrollX, scrollY, ScrollEvent.HorizontalTextScrollUnits.NONE, scrollX, ScrollEvent.VerticalTextScrollUnits.NONE, scrollY, x, y, node.getLayoutBounds().getMinX() + x, node.getLayoutBounds().getMinY() + y);
    }
    
    protected static void sendScrollEvent(final Scene scene, final Node node,
            double _scrollX, double _scrollY,
            ScrollEvent.HorizontalTextScrollUnits _scrollTextXUnits, double _scrollTextX,
            ScrollEvent.VerticalTextScrollUnits _scrollTextYUnits, double _scrollTextY,
            double _x, double _y,
            double _screenX, double _screenY) {
        //For 2.1.0 :
        //final ScrollEvent scrollEvent = ScrollEvent.impl_scrollEvent(_scrollX, _scrollY, _scrollTextXUnits, _scrollTextX, _scrollTextYUnits, _scrollTextY, _x, _y, _screenX, _screenY, false, false, false, false);
        //For 2.2.0 :
        //Interpretation: EventType<ScrollEvent> eventType, double _scrollX, double _scrollY, double _totalScrollX, double _totalScrollY, HorizontalTextScrollUnits _scrollTextXUnits, double _scrollTextX, VerticalTextScrollUnits _scrollTextYUnits, double _scrollTextY, int _touchPoints, double _x, double _y, double _screenX, double _screenY, boolean _shiftDown, boolean _controlDown, boolean _altDown, boolean _metaDown, boolean _direct, boolean _inertia)
        //For 8.0 before b64 and RT-9383
        //final ScrollEvent scrollEvent = new ScrollEvent.impl_scrollEvent(ScrollEvent.SCROLL, _scrollX, _scrollY, _scrollX, _scrollY, _scrollTextXUnits, _scrollTextX, _scrollTextYUnits, _scrollTextY, 0, _x, _y, _screenX, _screenY, false, false, false, false, false, false);
    
        //new ScrollEvent(EventType<ScrollEvent> eventType, 
        //double x, double y, double screenX, double screenY, 
        //boolean shiftDown, boolean controlDown, boolean altDown, boolean metaDown, 
        //boolean direct, boolean inertia, double deltaX, double deltaY, double gestureDeltaX, double gestureDeltaY, 
        //ScrollEvent.HorizontalTextScrollUnits textDeltaXUnits, double textDeltaX, 
        //ScrollEvent.VerticalTextScrollUnits textDeltaYUnits, double textDeltaY, int touchCount)
        final ScrollEvent scrollEvent = new ScrollEvent(ScrollEvent.SCROLL,
                _x, _y, _screenX, _screenY,
                false, false, false, false,
                false, false, _scrollX, _scrollY, 0, 0,
                _scrollTextXUnits, _scrollTextX,
                _scrollTextYUnits, _scrollTextY, 0, null /* PickResult?*/);
    
        Point2D pointOnScene = node.localToScene(node.getLayoutBounds().getWidth() / 4, node.getLayoutBounds().getHeight() / 4);
        final PickResultChooser result = new PickResultChooser();
        scene.getRoot().impl_pickNode(new PickRay(pointOnScene.getX(), pointOnScene.getY()), result);
        Node nodeToSendEvent = result.getIntersectedNode();
        nodeToSendEvent.fireEvent(scrollEvent);
    }
    

    【讨论】:

      猜你喜欢
      • 2022-11-04
      • 2017-05-15
      • 2015-03-21
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 2017-03-20
      • 2022-01-02
      • 2023-03-24
      相关资源
      最近更新 更多