2013-05-02 2 views
0

J'ai un volet qui écoute le défilement de la molette de la molette; ainsi j'ai une barre de défilement qui écoute automatiquement pour le rouleau de souris de roue. Je voudrais savoir comment envoyer à l'événement de défilement capturé par le volet à la barre de défilement.Comment envoyer des événements d'un nœud à un autre nœud

Je ne peux pas utiliser un volet de défilement car j'ai besoin d'une implémentation personnalisée du volet, j'ai déjà essayé d'utiliser un volet de défilement et cela ne couvrait pas mes besoins.

J'ai essayé de déclencher l'événement et une autre méthode, mais je peux juste obtenir que l'événement soit passé/propagé/envoyé à la barre de défilement.

Merci à l'avance

exemple d'application:

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

} 

Répondre

1

Semble, vous remettez en question est égale à la nécessité de la mise en œuvre du volet de défilement personnalisé.

Je pense, un moyen possible - est d'analyser l'événement, et faire barre de défilement changer sa valeur, lorsque l'événement arrive (ajouter un écouteur sur l'événement sur le volet, analyser si défiler vers le haut ou vers le bas barre de défilement).

Nous utilisons également une implémentation pour l'envoi d'événements par défilement. Utilisez ce scratch pour votre implémentation:

/** 
* 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); 
} 
Questions connexes