java - 停止显示多个 ListCell 上下文菜单

标签 java javafx javafx-8

我制作了一个自定义 ListView 单元格,这样我就可以添加一个上下文菜单,但当您单击多次时,它会不断打开多个上下文菜单,而旧的菜单在使用时只会引发异常。

Screenshot

这是我的 SongCell 类

public SongCell(ListView<Song> list, Playlist playlist) {

    setAlignment(Pos.CENTER_LEFT);

    ContextMenu listContextMenu = new ContextMenu();
    MenuItem removeItem = new MenuItem("Remove");
    MenuItem editID3Item = new MenuItem("Edit ID3");
    MenuItem playNextItem = new MenuItem("Play Next");
    removeItem.setOnAction((ActionEvent event) -> {

        list.getItems().remove(getIndex());

    });

    editID3Item.setOnAction((ActionEvent event) -> {
        Optional<Pair<String, String>> show = new FXID3Edit(getItem()).show();
    });
    playNextItem.setOnAction((ActionEvent event) -> {
        Song song = getItem();
        list.getItems().remove(song);
        playlist.addSongRequest(new SongRequest(song, SongRequest.type.NEXT));
    });

    listContextMenu.getItems().add(removeItem);
    listContextMenu.getItems().add(playNextItem);
    listContextMenu.getItems().add(editID3Item);

    setOnMousePressed(event -> {
        if (event.getButton().equals(MouseButton.SECONDARY)) {

            if (getItem() != null) {

                if (getItem().equals(playlist.getSong())) {
                    playNextItem.setDisable(true);
                    removeItem.setDisable(true);
                } else {
                    playNextItem.setDisable(false);
                    removeItem.setDisable(false);
                }
                listContextMenu.show(list, event.getScreenX(), event.getScreenY());
            }

        }

        if (event.getButton().equals(MouseButton.PRIMARY) && event.getClickCount() == 2) {
            playlist.setIndex(this.getIndex());
            playlist.play();

        }

        event.consume();
    });

}
@Override
protected void updateItem(Song item, boolean empty) {
    super.updateItem(item, empty);

    if (!empty && item != null) {
        this.setText(item.toString());
    } else {
        this.setText("");
    }
}

我也非常感谢对我的编码风格的帮助

最佳答案

不要注册鼠标监听器来显示上下文菜单,而是使用内置的 setContextMenu(...) 属性。即:

public SongCell(ListView<Song> list, Playlist playlist) {

    // ...

    setOnMousePressed(event -> {

        if (event.getButton().equals(MouseButton.PRIMARY) && event.getClickCount() == 2) {
            playlist.setIndex(this.getIndex());
            playlist.play();

        }

        event.consume();
    });

}

@Override
public void updateItem(Song item, boolean empty) {
    super.updateItem(item, empty);

    if (!empty && item != null) {
        this.setText(item.toString());
        this.setContextMenu(listContextMenu);
    } else {
        this.setText("");
        this.setContextMenu(null);
    }
}     

关于java - 停止显示多个 ListCell 上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31292481/

相关文章:

java - Java中变量赋值的可见性

java - 循环模块依赖在 Java 9 中是否可行?

JavaFX - 显示禁用标签的背景

java - 如何在 Javafx 8 中为标签文本添加上标

javafx-8 - 当监听器执行时移除监听器

java - 如何在不使用 .stopAndWait 方法的情况下使用 Javafx 中警报中的按钮?

java - 如何在没有PG服务器和Web控制台的情况下启动H2数据库命令行?

JavaFX 和 CSS : Prevent CSS inheritence for inner TabPane

java - 无法从静态上下文中引用非静态方法 getHostServices()

java - 在 main 中加载 fxml 文件