2016-10-10 81 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(需要註冊)。