Как сделать, чтобы JavaFX MediaView растягивал и сжимал носитель, чтобы заполнить / подогнать родительский контейнер?

Как сделать, чтобы JavaFX MediaView растягивал и сжимал носитель, чтобы заполнить / подогнать родительский контейнер?

Здесь уже есть вопрос:

Как сделать растяжку мультимедиа JavaFX MediaView для заполнения родительского контейнера?

и решение с этим кодом:

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

работает для увеличения видео, чтобы заполнить контейнер, но не позволяет контейнеру быть меньше, чем размер видео, поэтому он не сжимается, он просто начинает скрывать элементы управления, когда они выпадают за пределы сцены.

Любые идеи, как растянуть, но и уменьшить MediaView, чтобы соответствовать?

1 ответ

Решение

Я достиг этого, хотя я не очень уверен, что это лучший подход. Во-первых, как указал Фабиан, мне нужно установить 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>

Затем, при изменении размера, я изменяю размер 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);
Другие вопросы по тегам