【问题标题】:Metadata from Media is null, JavaFX来自媒体的元数据为空,JavaFX
【发布时间】:2020-06-03 18:14:54
【问题描述】:

我正在尝试通过单击按钮从列表视图中的歌曲中获取艺术家的姓名,但我得到了这个

null
null
null
null
XXXTENTACION
XXXTENTACION
XXXTENTACION
XXXTENTACION
XXXTENTACION
XXXTENTACION

这是我的代码


btnPlay.setOnAction(event -> {
            try {
                File selectedItem = listView.getSelectionModel().getSelectedItem();
                Media media = new Media(selectedItem.toURI().toString());
                mediaPlayer = new MediaPlayer(media);
                mediaPlayer.play();
                System.out.println(media);


                media.getMetadata().addListener((MapChangeListener<String, Object>) change -> {
                    String artist = (String)media.getMetadata().get("artist");
                    System.out.println(artist);
                });
            }
            catch (Exception e){
                System.out.println("Please choose the song...");
            }

如何正常打印,只打印一次?

【问题讨论】:

  • 这有关系吗?在现实生活中,您可能会将其设置为标签或其他内容的文本。将文本设置为 null 将不起作用,将其设置为现有值也是无操作的,所以像 someLabel.setText(artist); 这样的操作无论如何都会起作用。

标签: java javafx


【解决方案1】:

任何 元数据发生更改时,将调用您的侦听器。由于您只对艺术家何时更改以及更改为非空值感兴趣,因此您可以这样做:

media.getMetadata().addListener((MapChangeListener<String, Object>) change -> {
    if (change.getKey().equals("artist")) {
        String artist = (String)media.getMetadata().get("artist");
        if (artist != null) {
            System.out.println(artist);
        }
    }
});

这里也很安全地假设艺术家发生的唯一变化是添加了一个值(即从 null 变为非 null);做出这个假设你也可以这样做

media.getMetadata().addListener((MapChangeListener<String, Object>) change -> {
    if (change.getKey().equals("artist") && change.wasAdded()) {
        String artist = (String)change.getValueAdded();
        System.out.println(artist);
    }
});

请注意,通常在 UI 中,您不想在控制台中显示值,而是在标签(或类似的东西)中显示值。在这种情况下,实际上不需要检查正确的更改 - 您可以改用绑定:

Label artistLabel = new Label();
// ...

Media media = new Media(selectedItem.toURI().toString());
artistLabel.textProperty().bind(
    Bindings.valueAt(media.getMetadata(), "artist")
            .asString("Artist: %s"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-15
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多