2017-05-01 75 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的错误是正确的。正如你所说,我改变了它。 –