2013-05-02 109 views
0

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

我不能使用滚动窗格,因为我需要一个窗格的自定义实现,我已经尝试使用滚动窗格,它没有覆盖我的需要。

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

在此先感谢

示例应用程序:

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); 
    } 

} 

回答

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); 
} 
相关问题