我正在使用JavaFX處理圖片查看器。 我現在的問題是以下幾點:JavaFX - 在中心調整ImageView
每當一個新的Image
在ImageViewer
顯示(當用戶點擊「上一頁」或「下一頁」)的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
的中間,即X
和Y
的位置。
在此先感謝您的支持。
這看起來像你在做太多的工作。什麼是結構? HBox裏的ScrollPane裏面的ImageView?並且要求圖像採用自然尺寸,並且如果其自然尺寸大於可用空間,則可以滾動。 –
嗨James_D,可能吧。我用基本的Java編程了一年,而且我沒有那麼有經驗,我現在正在學習JavaFX大約6個月。我很欣賞關於我的代碼的任何提示! 結構如下:HBox中的ImageView和VBox以及ScrollPane中的HBox。 – Rouman
圖像取得場景寬度和高度的寬度和高度。 preserveRatio設置爲true。 – Rouman