如何使JavaFX MediaView拉伸媒体填充父级?

时间:2017-10-10 13:13:01

标签: java javafx

我想让JavaFX MediaView拉伸来填充父容器。

我之前从谷歌尝试了一些方法,但没有任何帮助(也许我没有正确应用它),并且有一个与此相同名称的问题,但该问题的解决方案可能不适合我。

首先我使用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'size绑定到stage'size,这是有效的,但代码看起来很难看,因为我需要手动计算大小。

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

有没有更好的解决方案?

2 个答案:

答案 0 :(得分:2)

使用下面的代码,您将看到您可以根据需要拉伸和缩小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,因此如果您仍然遇到问题或我无法理解您的需求,我猜您的代码还有其他问题。制作一个简单的可运行程序来演示该问题。

答案 1 :(得分:0)

尝试添加此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());
        }
    });

每次更改或最大化父级大小时都应调用此方法,然后视图也应调整为父级。