2017-05-01 69 views
2

我正在使用JavaFX 2.0開發項目。將ScrollPane設置爲期望的位置

enter image description here

當用戶點擊的源代碼同步按鈕時,應用程序將顯示圍繞UML模型等中的氣泡的相關源代碼:

場景當用戶創建一個UML模型像下面開始以下:

enter image description here

但是,正如你可能意識到了泡沫,這是在頂部創建不完全符合窗格。該窗格的目標視圖應該是這樣的:

enter image description here

即使我知道,我應該使用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

在此先感謝。

回答

2

我不確定它是否有效。

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; 
+0

它很完美!非常感謝!順便說一句,你對toBeScaled的錯誤是正確的。正如你所說,我改變了它。 –