gpt4 book ai didi

java - 两个同步的 ScrollPanes 未对齐

转载 作者:行者123 更新时间:2023-11-30 02:03:13 24 4
gpt4 key购买 nike

我尝试对齐两个 javafx.scene.control.ScrollPane 的垂直滚动位置通过

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

问题是这些 ScrollPanes 之一可能有水平滚动条。因此,我向下滚动 ScrollPanes 的次数越多,它们就越不对齐(请参见屏幕截图)。我该如何处理这个问题?

javafx scollpane misaligned

最佳答案

除非您在两个 ScrollPane 中显示滚动条,否则不可能使用 2 个 ScrollPane 和相同高度的内容来执行此操作:

考虑内容完全适合左侧 ScrollPaneviewport 的情况。右侧ScrollPaneviewPort 可以滚动ScrollBar 高度。无法修改左侧的 ScrollPane

由于预期结果似乎是某种比例,因此您可以简单地使用 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();
}

关于java - 两个同步的 ScrollPanes 未对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52139630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com