javafx:根据移动的可拖动节点移动滑块节点

javafx : move slider node as per the draggable node moved

场景:我有两个面板,其中一个有滑块,另一个有拖动山墙窗格。

案例 I:如果窗格(即拖动山墙)向前或向后移动。滑块上的节点随着窗格移动的相同方向的相应尺寸移动。

情况 II:此功能反之亦然。 (使用滑块拖动山墙窗格)
(带拖动山墙窗格的滑块)。

那么我该如何实现呢.. 谢谢!

你为水平方向创建了一个属性。然后每当滑块或窗格移动时更改 属性。根据 属性 的变化,您移动窗格。

public class Main extends Application {

    DoubleProperty xProperty = new SimpleDoubleProperty();

    double min = 0;
    double max = 100;


    @Override
    public void start(Stage primaryStage) {
        try {
            Pane root = new Pane();

            // rectangle
            Pane pane = new Pane();
            pane.setStyle("-fx-background-color:blue");
            pane.setPrefSize(50, 50);
            pane.relocate(min, 50);

            // make rectangle movable
            MouseGestures mg = new MouseGestures();
            mg.makeDraggable(pane);

            // slider
            Slider slider = new Slider(min, max, min);
            slider.valueProperty().bindBidirectional( xProperty);
            root.getChildren().addAll(slider, pane);

            // move horizontally, clamp horizontal movement
            xProperty.addListener(new ChangeListener<Number>() {

                @Override
                public void changed( ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {

                    // clamp x
                    double x = newValue.doubleValue();

                    if( x < min) {
                      x = min;
                    }

                    if( x > max) {
                        x = max;
                    }

                    pane.relocate( x, pane.getBoundsInParent().getMinY());

                }

            });



            Scene scene = new Scene(root,1024,768);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

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


    public class MouseGestures {

        final DragContext dragContext = new DragContext();

        public void makeDraggable(final Node node) {

            node.setOnMousePressed(onMousePressedEventHandler);
            node.setOnMouseDragged(onMouseDraggedEventHandler);

        }

        EventHandler<MouseEvent> onMousePressedEventHandler = new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent event) {

                Node node = (Node) event.getSource();
                dragContext.x = node.getBoundsInParent().getMinX() - event.getScreenX();

            }
        };

        EventHandler<MouseEvent> onMouseDraggedEventHandler = new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent event) {

                double offsetX = event.getScreenX() + dragContext.x;

                xProperty.set(offsetX);

            }
        };

        class DragContext {

            double x;

        }

    }   
}