2016-10-10 35 views
0

我正在使用JavaFX处理图片查看器。 我现在的问题是以下几点:JavaFX - 在中心调整ImageView

每当一个新的ImageImageViewer显示(当用户点击“上一页”或“下一页”)的ImageViewer应在其Parent节点得到重新定,在这种情况下,它是一个HBox 。我正在使用setTranslate方法并且工作正常,但它无法正常工作,因为每次加载新的Image时,ImageView都会采用不同的位置。

我用这个方法回到中心的ImageView

public void adjustImageViewBounds() 
{ 
    double windowWidth = MAIN.getWindow().getScene().getWidth(); 
    double windowHeight = MAIN.getWindow().getScene().getHeight(); 
    double imageWidth = GUI.getImageView().getImage().getWidth(); 
    double imageHeight = GUI.getImageView().getImage().getHeight(); 
    boolean isFullScreen = MAIN.getWindow().isFullScreen(); 

    GUI.getImageView().setFitWidth(windowWidth - 50 > imageWidth ? imageWidth : windowWidth - 50); 

    // 50 ~ 25px space on the left and right side 

    boolean scrollBarVisible = false; 
    Set<Node> nodes = GUI.getImageViewScrollPane().lookupAll(".scroll-bar"); 
    for(Node currentNode : nodes) 
    { 
     if(currentNode instanceof ScrollBar) 
      if(((ScrollBar) currentNode).getOrientation() == Orientation.VERTICAL) 
       if(currentNode.isVisible()) 
        scrollBarVisible = true;  
    } 
    if(!scrollBarVisible && !isFullScreen) 
    { 
     // 80 ~ GUI.getInfoBoxAndImageView().getLayoutY() -> The Y position within the window of my whole ImageView container (HBox) 
     // 65 ~ GUI.getLowerControl().getHeight() -> The height of the controlbar under the ImageView 
     double newTranslateY = (windowHeight/2) - 80 - (VISIBLE_IMAGE_HEIGHT.divide(2).doubleValue()); 
     GUI.getInfoBoxAndImageView().setTranslateY(newTranslateY >= 0 && (newTranslateY + 80 + VISIBLE_IMAGE_HEIGHT.doubleValue()) < (windowHeight - 65) ? newTranslateY : 0); 
    } 
    else if(scrollBarVisible) 
    { 
     GUI.getInfoBoxAndImageView().setTranslateY(0); 
    } 
    else if(isFullScreen) 
    { 
     double newTranslateY = (windowHeight/2) - 80 - (VISIBLE_IMAGE_HEIGHT.divide(2).doubleValue()); 
     GUI.getInfoBoxAndImageView().setTranslateY(newTranslateY >= 0 && (newTranslateY + 80 + VISIBLE_IMAGE_HEIGHT.doubleValue()) < (windowHeight - 65) ? newTranslateY : 0); 
    } 
} 

的工作,只要我把它叫做后的Image加载,但是当我后调用它它不工作的方法设置一个新的Image。 下面是当一个新的Image设定的一个例子:

public void nextClicked() 
    { 
     if(PICTURE_INDEX < picturePaths.size() - 1) 
     { 
      String path = picturePaths.get(PICTURE_INDEX + 1).toURI().toString(); 
      GUI.getImageView().setImage(new Image(path)); 
      adjustImageViewBounds(); 
      PICTURE_INDEX += 1; 
     } 
    } 

为了解决这个问题我一直在尝试使用不同的Listeners

GUI.getImageViewer().imageProperty().addListener(newImage -> 
{ 
    while(newImage.getProgress() < 1.0) 
    { 
     //Do nothing until the Image is completely loaded 
    } 
    adjustImageViewBounds(); 
    System.out.println("End reached"); 
}); 

结束时居然达到了,但该方法没不影响ImageView的位置?!? 也不能正常工作:

public void nextClicked() 
{ 
    if(PICTURE_INDEX < picturePaths.size() - 1) 
    { 
     String path = picturePaths.get(PICTURE_INDEX + 1).toURI().toString(); 
     Image newImage = new Image(path); 
     newImage.progressProperty().addListener((obs, oldV, newV) -> 
     { 
     if(newV.doubleValue() == 1.0) 
      adjustImageViewBounds(); 
     }); 
     GUI.getImageView().setImage(newImage); 
     PICTURE_INDEX += 1; 
    } 
} 

只是为了好玩我想这和它的工作,但它当然不是一个合理的解决方案:

GUI.getImageView().setOnMouseClicked(event -> adjustImageViewBounds()); 

总之一切混乱的信息: 我想我ImageView到通过adjustImageViewBounds()方法获得重新认可,这个方法本身就可行! Recenter表示将我的ImageView置于Scene的中间,即XY的位置。

在此先感谢您的支持。

+0

这看起来像你在做太多的工作。什么是结构? HBox里的ScrollPane里面的ImageView?并且要求图像采用自然尺寸,并且如果其自然尺寸大于可用空间,则可以滚动。 –

+0

嗨James_D,可能吧。我用基本的Java编程了一年,而且我没有那么有经验,我现在正在学习JavaFX大约6个月。我很欣赏关于我的代码的任何提示! 结构如下:HBox中的ImageView和VBox以及ScrollPane中的HBox。 – Rouman

+0

图像取得场景宽度和高度的宽度和高度。 preserveRatio设置为true。 – Rouman

回答

1

而不是从其父确定它的位置移动ImageView,使用setTranslateY(...)的,它几乎肯定更好的选择和配置一个父,将你放在第一位希望的方式定位。例如,HBoxVBox都具有确定父节点内的子节点的整体对齐的方法。最“一般”(即灵活的)预定义布局是GridPane,其中子节点位于网格中,并且可以跨越网格中的多个单元。网格中的不同列和行可以具有不同的宽度和高度,并且您可以配置子节点的行为方式,如果其分配的单元具有比节点首选大小更多的空间。

一些有用的链接:

所有布局窗格的概述在tutorial给出。有关整体布局机制的稍陈旧一些,但仍然有用,请参阅parleys.com(需要注册)。