2015-09-11 43 views
1

我試圖找出如何從媒體中獲取元數據一段時間,但到目前爲止沒有任何工作。我上課宋凡我有這樣的標題SimpleStringProperties,藝術家等等。我嘗試在類的構造函數爲它們設置的值:Javafx元數據

private final SimpleStringProperty title; 
private final SimpleStringProperty artist; 

public Song(String path) { 
    this.song = new MediaPlayer(new Media(path)); 
    this.artist = new SimpleStringProperty(this, "artist"); 
    this.title = new SimpleStringProperty(this, "title"); 
    this.song.setOnReady(() -> { 
     title.set(song.getMedia().getMetadata().get("title").toString()); 
     artist.set(song.getMedia().getMetadata().get("artist").toString()); 
    }); 
} 

然後我試圖在一個FXML控制器一首新歌:

Song song = new Song(path); 
System.out.println(song.getTitle()); 
System.out.println(song.getArtist()); 

,我看到控制檯

null 
null 

我知道,在setOnReady()方法它顯示標題和藝術家正常。我有一個Platform.runLater()的解決方案,但當有更多的新歌時它不能正常工作。我已閱讀了一些關於synchronized()的內容,但我不知道如何使用它。我正在等待一些解決方案。在此先感謝:)

回答

1

在調用處理程序之前(即在MediaPlayer準備就緒之前),您正在調用getTitle()getArtist()

大概你並不是真的想把這些展示給系統控制檯,而只是做測試。嘗試類似

Label titleLabel = new Label(); 
Label artistLabel = new Label(); 
Song song = new Song(path); 
titleLabel.textProperty().bind(song.titleProperty()); 
artistLabel.textProperty().bind(song.artistProperty()); 

然後在UI中顯示這些標籤。當數據可用時,它們將自動更新。

+0

它的工作原理,謝謝!這正是我所期待的。 –

+0

我還有一個問題。我想在添加新歌曲時檢查歌曲是否已經在播放列表中。我有一個'SimpleListProperty 播放列表',我使用'contains()'方法。我已經在Song類中覆蓋了equals()和hashcode()方法,但是當比較標題,藝術家等歌曲字段時,它們似乎還沒有被初始化。它導致'contains()'方法不會返回它應該的內容。有沒有什麼辦法可以等到所有的字段都被初始化? –