2017-10-10 70 views
0

我想讓JavaFX MediaView拉伸以填充父容器。如何使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,它的工作,但代碼看起來很醜,因爲我需要計算尺寸manully。

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

有沒有更好的解決方案?

+0

不要使用AnchorPane了點。將您的MediaView放在BorderPane的中心。 – VGR

回答

1

使用下面你的代碼會看到,你是能夠伸展並不亞於你喜歡縮小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以及所以我想如果您的問題仍然存在,或者我不瞭解您的需求,那麼代碼還有其他問題。製作一個簡單的可運行程序來演示該問題。

+0

它的工作好,和一些測試後,我發現我的錯誤是不是這個原因引起的,謝謝 – BlackCat

0

嘗試添加該動作監聽用於重新調整大小:

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()); 
     } 
    }); 

這應該叫每個父尺寸得到了改變或最大化,然後在視圖應該被調整到父,太費時間。

+0

我嘗試,並找到它可以擴大,但不能縮小。 – BlackCat

+0

當我展開窗口時,anchorpane的寬度變大了,但是當我嘗試縮小窗口時,anchorpane的寬度不會改變。 – BlackCat

+0

我很抱歉 - 您需要嘗試一些更改。我現在很忙,所以也許其他人有一些空間來幫助:) 只想說 - 不要等我。 – LenglBoy