簡體   English   中英

如何使JavaFX MediaView拉伸媒體填充父級?

[英]How do I make JavaFX MediaView stretch media to fill parent?

我想使JavaFX MediaView拉伸以填充父容器。

我之前嘗試過Google的一些方法,但沒有幫助(也許我沒有正確應用),並且有一個與此名稱相同的問題,但是該問題中的解決方案可能不適合我。

首先,我使用ahchorpane錨定mediaview,但發現它無法拉伸mediaview,而且我不知道為什么,因為其他控件(如按鈕)可以工作。

然后我嘗試將其寬度和高度綁定到anchorpane(mediaview的父對象)

    Region region=(Region) mediaplayer.getParent();
    mediaplayer.setPreserveRatio(false);
    mediaplayer.fitWidthProperty().bind(region.widthProperty());
    mediaplayer.fitHeightProperty().bind(region.heightProperty());

調整窗口大小時,它可以完全擴展mediaview,但不能縮小! 我猜可能是因為區域的大小取決於孩子嗎?

最后,我嘗試將mediaview的大小綁定到stage的大小,這是可行的,但是代碼看起來很難看,因為我需要手動計算大小。

    mediaplayer.setPreserveRatio(false);
    mediaplayer.fitWidthProperty().bind(stage.widthProperty().subtract(200));
    mediaplayer.fitHeightProperty().bind(stage.heightProperty().subtract(135));

有沒有更好的解決方案?

使用下面的代碼,您會看到您可以隨意縮放MediaView(取決於舞台尺寸)

import java.io.File;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

public class TestApp extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {

        BorderPane pane = new BorderPane();

        FileChooser fc = new FileChooser();
        File mediaFile = fc.showOpenDialog(null);

        MediaView moviePlayer;

        if (mediaFile != null) {
            MediaPlayer player = new MediaPlayer(new Media(mediaFile.toURI().toString()));

            moviePlayer = new MediaView(player);

            moviePlayer.setPreserveRatio(false);
            moviePlayer.fitWidthProperty().bind(pane.widthProperty());
            moviePlayer.fitHeightProperty().bind(pane.heightProperty());

            pane.getChildren().add(moviePlayer);
            player.play();

        }

        Scene scene = new Scene(pane, 300, 300);
        stage.setScene(scene);
        stage.show();
    }
}

該代碼也可與AnchorPane一起使用,因此,如果您仍然遇到問題或我不了解您的需求,我想您的代碼還有其他問題。 制作一個簡單的可運行程序來演示該問題。

嘗試添加此Action-Listener以重新調整大小:

MediaView.getParent().layoutBoundsProperty().addListener(new ChangeListener<Bounds>() {
        @Override
        public void changed(ObservableValue<? extends Bounds> observable, Bounds oldValue, Bounds newValue) {
            mediaView.setFitHeight(newValue.getHeight());
            mediaView.setFitWidth(newValue.getWidth());
        }
    });

每次更改父級大小或最大化父級大小時都應調用此方法,然后也應將視圖大小調整為父級。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM