如何使JavaFX MediaView拉伸和缩小媒体以填充/适合父容器?

时间:2018-01-04 12:22:32

标签: java javafx mediaview

如何使JavaFX MediaView拉伸并缩小媒体以填充/适合父容器?

这里已经有了一个问题:

How do I make JavaFX MediaView stretch media to fill parent container?

以及使用此代码的解决方案:

<Pane fx:id="mediaViewPane">
  <children>
     <MediaView fx:id="videoView" fitHeight="${mediaViewPane.height}" fitWidth="${mediaViewPane.width}" layoutX="1.0" />
  </children>
</Pane>

用于使视频更大以填充容器,但它不允许容器小于视频的大小,因此,它不会缩小,它只是开始隐藏控件,因为它们落在场景。

任何想法如何拉伸但缩小MediaView以适应?

1 个答案:

答案 0 :(得分:0)

我已经实现了这一点,尽管我对这是最好的方法并不十分自信。首先,正如fabian指出的那样,我需要将MediaView设置为不受管理,以便可以将父Pane调整为任意大小,而MediaView不限制它:

<Pane fx:id="mediaViewPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="0.0" minWidth="0.0">
    <MediaView fx:id="mediaView" StackPane.alignment="CENTER" managed="false"/>
</Pane>

然后,在rezise事件中,我调整MediaView的大小以适应父级,然后获取视频的实际大小并将其偏移到中心:

InvalidationListener resizeMediaView = observable -> {
    mediaView.setFitWidth(mediaViewPane.getWidth());
    mediaView.setFitHeight(mediaViewPane.getHeight());

    // After setting a big fit width and height, the layout bounds match the video size. Not sure why and this feels fragile.
    Bounds actualVideoSize = mediaView.getLayoutBounds();
    mediaView.setX((mediaView.getWidth() - actualVideoSize.getWidth()) / 2);
    mediaView.setY((mediaView.getHeight() - actualVideoSize.getHeight()) / 2);
};
mediaViewPane.heightProperty().addListener(resizeMediaView);
mediaViewPane.widthProperty().addListener(resizeMediaView);