java - 如何从 JavaFX Media 对象获取媒体详细信息(标题、专辑等)并将详细信息添加到 ObservableList?
问题描述
我已经创建了一个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
最终但无济于事。我也尝试过初始化playListItem
对象和playListData.add(playListItem)
内部 lambda 函数,但由于事件侦听器迭代,它插入了许多 null 标题值的标题。
我还使用局部变量进行了测试,但我无法获取侦听器 lambda 函数之外的值。
解决方案
我解决了这个问题。我的解决方案是在 bean 类的构造函数中传递 Media 对象,并在 bean 类中创建另一个方法,该方法将检索媒体信息并更新 bean 对象。该方法通过构造函数调用。现在在 ObservableList 中添加这个 bean 类的对象。触发媒体信息事件时,可观察列表会自动更新。现在我可以使用 ObservableList 并使用 table.refresh() 方法渲染 tableview,我可以在触发事件时刷新表数据。
推荐阅读
- python - Getting different y-axis range using plot/scatter on matplotlib
- node.js - "npm ci" command causing longer build time on gitlab than the "npm i"
- python - 如何将自定义对象序列化/编码为字节/字节数组?
- c++ - 在 CIMG 中附加图像并保存在 stb_image_write 中不起作用
- android - Android non-square hit areas. Can it be done?
- r - 不返回 NA 值的左连接
- java - AndroidRuntime: java.lang.RuntimeException: Parcelable遇到IOException写入可序列化对象
- vue.js - 如何使用带有 img 标签的 v-slot?
- go - proto 请求中枚举的输入验证
- ios - 向 iOS 设备发送数据消息会导致 FirebaseMessagingException:请求包含无效参数