Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在播放列表表视图中突出显示当前播放的歌曲?_Java_User Interface_Javafx_Tableview_Media Player - Fatal编程技术网

Java 如何在播放列表表视图中突出显示当前播放的歌曲?

Java 如何在播放列表表视图中突出显示当前播放的歌曲?,java,user-interface,javafx,tableview,media-player,Java,User Interface,Javafx,Tableview,Media Player,我正在编写某种音乐播放器应用程序,我的播放列表表在左边,我试图突出显示播放列表中当前播放的歌曲。当我从播放列表中双击歌曲播放时,这可以正常工作,但是,我的问题是当当前歌曲结束后自动播放新歌时,或者当我单击“下一步”或“上一步”按钮时 我通过双击处理突出显示的方法是直接在行工厂中进行,然后添加它,并将该功能添加到TableRow.onMouseClick事件处理程序中 在过去的几天里,我一直试图通过“下一个”和“上一个”按钮来实现这一点,但都没有成功 我目前的想法如下:在行工厂中添加某种自定义事件

我正在编写某种音乐播放器应用程序,我的播放列表表在左边,我试图突出显示播放列表中当前播放的歌曲。当我从播放列表中双击歌曲播放时,这可以正常工作,但是,我的问题是当当前歌曲结束后自动播放新歌时,或者当我单击“下一步”或“上一步”按钮时

我通过双击处理突出显示的方法是直接在行工厂中进行,然后添加它,并将该功能添加到TableRow.onMouseClick事件处理程序中

在过去的几天里,我一直试图通过“下一个”和“上一个”按钮来实现这一点,但都没有成功

我目前的想法如下:在行工厂中添加某种自定义事件监听器,它自己监听播放列表中当前播放索引的更改,但我不确定如何实现,因为我对JavaFX和GUI一般来说都是新手

下面是一张通过双击播放歌曲时应用程序外观的图片:

以下是一些相关的代码部分:

几个全局变量:

private TableRow<PlaylistTable> lastPlayed;
private TableRow<PlaylistTable> currentPlayed;
控制器类的initialize方法中具有onMouseClick事件处理程序的行工厂:

 playlistTable.setRowFactory(e -> {
        TableRow<PlaylistTable> row = new TableRow<>();

        row.setOnMouseClicked(e1 -> {

            if (e1.getButton() == MouseButton.PRIMARY && e1.getClickCount() == 2) {
                if (lastPlayed == null) {
                    lastPlayed = row;
                } else if (lastPlayed != row) {
                    lastPlayed.setStyle("");  //("-fx-background-color: #39CCCC;-fx-border-color: white; -fx-text-fill: white;");
                    lastPlayed = row;
                }
                playSongFromPlaylist();
                currentPlayed = row;

                row.setStyle("-fx-background-color: #FFDC00;-fx-border-color: black; -fx-text-fill: white;");
                System.out.println("highlighting row");


            }
        });
此方法调用播放歌曲的实际方法,即playSongFromPlaylist,但该方法在这里有点不相关,因为它会处理所有事情,实际上控制音乐播放器本身及其外观

public void playSong() {
    if (!playlist.getCurrentSong().isPresent()) {
        System.out.println("returning");
        return;
    }

    System.out.println(playlistTable.getSelectionModel().getSelectedIndex());
    int currentIndex = playlist.getCurrent().get();
    Song song = playlist.getCurrentSong().get();
    System.out.println("current index: " + currentIndex);

    playlistTable.getSelectionModel().select(currentIndex);
    selectedFromButtons = true;
    System.out.println(playlistTable.getSelectionModel().getSelectedIndex());
    playSongFromPlaylist();
}

最简单的方法可能是为当前播放的歌曲引入属性,并(取消)在项目和歌曲更改上设置CSS伪类:

final ObjectProperty<PlaylistTable> currentSong = new SimpleObjectProperty();
final PseudoClass playing = PseudoClass.getPseudoClass("playing");

playlistTable.setRowFactory(e -> {

    final TableRow<PlaylistTable> row = new TableRow<>();
    InvalidationListener listener = o -> {
        row.pseudoClassStateChanged(playing, currentSong.get() == row.getItem());
    };
    row.itemProperty().addListener(listener);
    currentSong.addListener(listener);

    ...

    return row;
});
通过设置
currentSong
的值,可以突出显示包含当前播放歌曲的行

您需要从事件处理程序中删除样式。无论如何,这都不能正常工作,因为行的item属性可以由
TableView
修改


注意:您可能还需要添加不同的规则来显示播放和选择/聚焦不同的歌曲。

嘿,非常感谢您的回答。我有点理解你的意思,但不是100%。我正在尝试应用您的代码,但此行有一个问题:row.pseudoClassStateChanged(playing,currentSong.get());As currentSong.get()返回播放列表项,但该方法应为布尔值。“我不知道该放什么进去。”鲁迪亚拉布尼已经在我的帖子中解决了这个问题。当然,它应该与行中的项目进行比较…非常感谢!成功了!几个小时以来,我们一直在努力寻找解决方案@如果这个答案回答了问题,你应该把它标记为正确的。我会的。我知道这是一个愚蠢的问题,但在哪里可以选择这样做呢?:)编辑-评级下的勾号?
public void playSong() {
    if (!playlist.getCurrentSong().isPresent()) {
        System.out.println("returning");
        return;
    }

    System.out.println(playlistTable.getSelectionModel().getSelectedIndex());
    int currentIndex = playlist.getCurrent().get();
    Song song = playlist.getCurrentSong().get();
    System.out.println("current index: " + currentIndex);

    playlistTable.getSelectionModel().select(currentIndex);
    selectedFromButtons = true;
    System.out.println(playlistTable.getSelectionModel().getSelectedIndex());
    playSongFromPlaylist();
}
final ObjectProperty<PlaylistTable> currentSong = new SimpleObjectProperty();
final PseudoClass playing = PseudoClass.getPseudoClass("playing");

playlistTable.setRowFactory(e -> {

    final TableRow<PlaylistTable> row = new TableRow<>();
    InvalidationListener listener = o -> {
        row.pseudoClassStateChanged(playing, currentSong.get() == row.getItem());
    };
    row.itemProperty().addListener(listener);
    currentSong.addListener(listener);

    ...

    return row;
});