【发布时间】:2019-01-22 14:04:08
【问题描述】:
我创建了一个ArrayList 的媒体文件路径,我想在我的 JavaFX 应用程序中获取媒体文件的详细信息,例如标题和专辑信息。我想在ObservableList 中添加这些详细信息。所以我创建了一个迭代器,它给出了所有媒体文件的路径。在迭代器循环中,我创建了一个 Media 对象。为了从Media 对象获取媒体信息,我创建了元数据事件监听器。我在 lambda 函数中获得了媒体信息,但我无法在 lambda 函数之外使用它们。如果我在 ObservableList 事件侦听器 lambda 函数中添加信息,则由于元数据迭代而插入许多空值,并且只插入一个有用的信息。
这是我的代码:
ObservableList<PlayListModel> playListData = FXCollections.observableArrayList();
Iterator<JMPPlayListItem> it = playList.getIterator();
while(it.hasNext()) {
listMedia = new Media(it.next().getPath());
PlayListModel playListItem = new PlayListModel();
listMedia.getMetadata().addListener((MapChangeListener.Change<? extends String, ? extends Object> c)-> {
if (c.wasAdded()) {
if ("artist".equals(c.getKey())) {
playListItem.setArtist(c.getValueAdded().toString());
} else if ("title".equals(c.getKey())) {
// It prints title of song
System.out.println(c.getValueAdded().toString());
playListItem.setTitle(c.getValueAdded().toString());
} else if ("album".equals(c.getKey())) {
playListItem.setAlbum(c.getValueAdded().toString());
}
}
});
// It print null
System.out.println(playListItem.getTitle());
playListData.add(playListItem);
}
System.out.println(c.getValueAdded().toString()) 正在打印歌曲的标题,但在 lambda 函数 System.out.println(playListItem.getTitle()) 之外打印 null。这意味着playListItem 对象的值没有改变。我尝试将playListItem 设为最终但无济于事。我还尝试在 lambda 函数中初始化 playListItem 对象和 playListData.add(playListItem),但由于事件侦听器迭代,它会插入带有许多空标题值的标题。
我还使用局部变量进行了测试,但我无法获取侦听器 lambda 函数之外的值。
【问题讨论】:
-
Media对象的元数据不能立即获得。从文档中,“媒体信息是异步获取的,因此在类实例化后不一定立即可用。但是,如果实例已与MediaPlayer关联并且该播放器已转换为 @,则所有信息都应该可用987654336@状态”。你去打印出来的时候标题还没有设置。 -
但是当我在 addListener 函数中打印时,媒体信息正在打印。我只是无法在 addListener 函数之外使用这些信息。
-
您的听众正在观察元数据的
ObservableMap。 当值可用时会通知它。 -
我现在明白你的意思了。那么这种情况有什么解决办法呢?
-
由于
printlns 可能只是用于调试,您在哪里尝试使用这些值?你遇到的实际问题是什么?请提供minimal reproducible example。