代码之家  ›  专栏  ›  技术社区  ›  Sebastian

两个同步滚动窗格未对齐

  •  1
  • Sebastian  · 技术社区  · 6 年前

    javafx.scene.control.ScrollPane s通过

    sp1.vvalueProperty().bindBidirectional(sp2.vvalueProperty());
    

    javafx scollpane misaligned

    1 回复  |  直到 6 年前
        1
  •  2
  •   fabian    6 年前

    用2个是不可能的 ScrollPane 和内容的高度相等,除非同时显示滚动条 学生:

    考虑一下内容符合 viewport 左派的 滚动窗格 确切地。这个 viewPort 右边的 滚动窗格 可以通过 ScrollBar 高度。修改左侧 滚动窗格

    由于预期的结果似乎是某种规模,您可以简单地使用 Pane 带着孩子你申请 transformY 去拿一个夹子。计算要放置在顶部的像素的公式,使用

    top = vvalue * (contentHeight - viewportHeight)
    

    例子

    private static Label createLabel(int num, boolean mark) {
        Label label = new Label(Integer.toString(num));
        label.setPrefSize(50, 50);
        label.setMaxSize(Double.MAX_VALUE, Region.USE_PREF_SIZE);
        label.setStyle(mark ? "-fx-background-color: #FFFFFF" : "-fx-background-color: #BBBBBB;");
        return label;
    }
    
    @Override
    public void start(Stage primaryStage) throws Exception {
        VBox scale = new VBox();
        scale.setMinHeight(Region.USE_PREF_SIZE);
        GridPane content = new GridPane();
    
        for (int i = 0; i < 40; i++) {
            boolean b = ((i % 2) == 0);
            scale.getChildren().add(createLabel(i, !b));
    
            for (int j = 0; j < 10; j++) {
                content.add(createLabel(i * 10 + j, b), j, i);
            }
        }
    
        AnchorPane scaleContainer = new AnchorPane(scale);
        scaleContainer.setMinWidth(30);
        scaleContainer.setMinHeight(0);
        AnchorPane.setLeftAnchor(scale, 0d);
        AnchorPane.setRightAnchor(scale, 0d);
    
        Rectangle clip = new Rectangle();
        scaleContainer.setClip(clip);
        clip.widthProperty().bind(scaleContainer.widthProperty());
        clip.heightProperty().bind(scaleContainer.heightProperty());
    
        ScrollPane scroll = new ScrollPane(content);
    
        scale.translateYProperty().bind(Bindings.createDoubleBinding(() -> {
            double contentHeight = content.getHeight();
            double viewportHeight = scroll.getViewportBounds().getHeight();
            if (contentHeight <= viewportHeight) {
                return 0d;
            } else {
                return -scroll.getVvalue() * (contentHeight - viewportHeight);
            }
        }, scroll.viewportBoundsProperty(), scroll.vvalueProperty(), content.heightProperty()));
    
        HBox root = new HBox(scaleContainer, scroll);
        root.setPadding(new Insets(10));
    
        Scene scene = new Scene(root, 400, 400);
    
        primaryStage.setScene(scene);
        primaryStage.show();
    }