簡體   English   中英

將ScrollPane設置到所需位置

[英]Setting ScrollPane to the Desired Position

我正在用JavaFX 2.0開發一個項目。

當用戶創建如下所示的UML模型時,該場景開始:

在此處輸入圖片說明

當用戶單擊源代碼同步按鈕時,應用程序將在UML模型周圍的Bubbles中顯示相關的源代碼,如下所示:

在此處輸入圖片說明

但是,您可能會意識到,在頂部創建的氣泡並不完全適合窗格。 窗格的所需視圖應如下所示:

在此處輸入圖片說明

即使我知道我應該使用HValueVValue屬性來完成此操作。 我不明白如何設置ScrollPane這些新值。

ScrollPane的大小為8000 x 8000,我通過調用rescaleView()函數創建了一個不可見的矩形,該矩形覆蓋了所有UML模型和氣泡。 因此,根據該矩形的值,我正在重新縮放ScrollPane,但無法再次移動視口中心。 這是重新縮放的功能:

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)函數不會使視口居中:

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似乎有不受歡迎的情況,例如內容寬度很長的垂直滾動條。 如果誤解,請忽略下面的代碼。

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM