gpt4 book ai didi

java - 将 ScrollPane 设置到所需位置

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

我正在 JavaFX 2.0 中开发一个项目。

当用户创建如下所示的 UML 模型时,该场景开始:

enter image description here

当用户单击源代码同步按钮时,应用程序会在 UML 模型周围的气泡中显示相关源代码,如下所示:

enter image description here

但是,您可能会意识到,在顶部创建的气泡并不完全适合 Pane 。所需的 Pane View 应如下所示:

enter image description here

即使我知道应该使用 HValueVValue 属性来完成此操作。我无法理解应该如何设置 ScrollPane 的这些新值。

ScrollPane 的大小为 8000 x 8000,我正在通过调用 rescaleView() 函数创建一个覆盖所有 UML 模型和气泡的不可见矩形。因此,根据该矩形的值,我正在重新缩放 ScrollPane,但无法再次移动视口(viewport)中心。这是重新缩放的函数:

private void rescaleView() {
double MARGIN = 5.0;

List<BubbleView> bubbleViews = new ArrayList<>(diagramController.getAllBubbleViews());

double xMin = bubbleViews.get(0).getX();
double yMin = bubbleViews.get(0).getY();
double xMax = bubbleViews.get(0).getX() + bubbleViews.get(0).getWidth();
double yMax = bubbleViews.get(0).getY() + bubbleViews.get(0).getHeight();

if(bubbleViews.size() > 0) {
for(int i = 1; i < bubbleViews.size(); i++) {
if((bubbleViews.get(i).getX() + bubbleViews.get(i).getWidth()) > xMax) {
xMax = bubbleViews.get(i).getX() + bubbleViews.get(i).getWidth();
}

if(bubbleViews.get(i).getX() < xMin) {
xMin = bubbleViews.get(i).getX();
}

if((bubbleViews.get(i).getY() + bubbleViews.get(i).getHeight()) > yMax) {
yMax = bubbleViews.get(i).getY() + bubbleViews.get(i).getHeight();
}

if(bubbleViews.get(i).getY() < yMin) {
yMin = bubbleViews.get(i).getY();
}
}

double toBeScaled = Math.min((Math.max(diagramController.getScrollPane().getWidth(), diagramController.getScrollPane().getHeight()) / Math.max((xMax - xMin), (yMax - yMin))),(Math.min(diagramController.getScrollPane().getWidth(), diagramController.getScrollPane().getHeight()) / Math.min((xMax - xMin), (yMax - yMin)))) * 100;
diagramController.getGraphController().zoomPane(toBeScaled - MARGIN);
diagramController.getGraphController().center(xMin, yMin);
}
}

但是下面的center(x,y)函数不会使视口(viewport)居中:

public void center(double x, double y) {
ScrollPane scrollPane = diagramController.getScrollPane();

double xScroll = x / 8000; //8000 is the size of aDrawPane set in view.classDiagramView.fxml
double yScroll = y / 8000;

scrollPane.setHvalue(xScroll);
scrollPane.setVvalue(yScroll);
}

我应该如何设置这些setHValuesetVValue

提前致谢。

最佳答案

我不确定它是否有效。

diagramController.getGraphController().center((xMax + xMin) / 2, (yMax + yMin) / 2);
<小时/>
double xScroll = (x - scrollPane.getWidth() / 2) / (8000 - scrollPane.getWidth());
double yScroll = (y - scrollPane.getHeight() / 2) / (8000 - scrollPane.getHeight());

toBeScaled似乎有不良情况,例如垂直长的scrollPane具有宽的内容。如果有误解请忽略下面的代码。

final double scrollPaneWidth = diagramController.getScrollPane().getWidth();
final double scrollPaneHeight = diagramController.getScrollPane().getHeight();
final double contentsWidth = xMax - xMin;
final double contentsHeight = yMax - yMin;
double toBeScaled = Math.min(scrollPaneHeight / contentsHeight, scrollPaneWidth / contentsWidth) * 100;

关于java - 将 ScrollPane 设置到所需位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43719314/

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