我正在使用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