Always visible when scrolled anchored Node in Java FX 2.0?

后端 未结 1 886
孤独总比滥情好
孤独总比滥情好 2021-01-17 04:47

I want to make a node present in a ScrollPane anchored to the top (fixed on the Y axis) but capable of scrolling in the X axis. (In Java-FX 2.0)

Is this possible?

相关标签:
1条回答
  • 2021-01-17 05:08

    You can use binding to adjust this special object position based on scrollbar position, see next code:

    public class FancyScrollPane extends Application {
    
        @Override
        public void start(Stage primaryStage) {
            ScrollPane scrollPane = new ScrollPane();
            Pane content = new Pane();
            scrollPane.setContent(content);
    
            // adding background
            content.getChildren().add(new Rectangle(500, 500, Color.GREEN));
    
            Circle immovableObject = new Circle(30, Color.RED);
            content.getChildren().add(immovableObject);
    
            primaryStage.setScene(new Scene(scrollPane, 300, 300));
            primaryStage.show();
    
            // here we bind circle Y position
            immovableObject.layoutYProperty().bind(
                    // to vertical scroll shift (which ranges from 0 to 1)
                    scrollPane.vvalueProperty()
                        // multiplied by (scrollableAreaHeight - visibleViewportHeight)
                        .multiply(
                            content.heightProperty()
                                .subtract(
                                    new ScrollPaneViewPortHeightBinding(scrollPane))));
        }
    
        // we need this class because Bounds object doesn't support binding 
        private static class ScrollPaneViewPortHeightBinding extends DoubleBinding {
    
            private final ScrollPane root;
    
            public ScrollPaneViewPortHeightBinding(ScrollPane root) {
                this.root = root;
                super.bind(root.viewportBoundsProperty());
            }
    
            @Override
            protected double computeValue() {
                return root.getViewportBounds().getHeight();
            }
        }
    
        public static void main(String[] args) { launch(); }
    }
    
    0 讨论(0)
提交回复
热议问题