Java 如果只提供与JMenuItem关联的字符串,是否可以从JMenuItem中删除JMenuItem

Java 如果只提供与JMenuItem关联的字符串,是否可以从JMenuItem中删除JMenuItem,java,swing,jmenu,jmenuitem,Java,Swing,Jmenu,Jmenuitem,我有一个JMenu,其中填充了来自具有侦听器的数据库的JMenuItems,其中一个侦听器是从数据库中删除条目(如果选中)。发生这种情况时,JMenuItem应该从菜单中消失。这里有一个简短的例子 for (final Racer r : Racer.getAllRacers()) { JMenuItem j = new JMenuItem(r.getName()); racerDelete.add(j); j.addActionListener(

我有一个JMenu,其中填充了来自具有侦听器的数据库的JMenuItems,其中一个侦听器是从数据库中删除条目(如果选中)。发生这种情况时,JMenuItem应该从菜单中消失。这里有一个简短的例子

for (final Racer r : Racer.getAllRacers()) {
        JMenuItem j = new JMenuItem(r.getName());
        racerDelete.add(j);
        j.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                int reply = JOptionPane.showConfirmDialog(null,
                        "Are you sure you want to delete racer " + r.getName() + "?", "Delete?",
                        JOptionPane.YES_NO_OPTION);
                if (reply == JOptionPane.YES_OPTION){
                    r.delete();
                    racerDelete.remove(???);
                }

            }
        });
    }

那个么我可以用什么来代替“?”?r的字段是我用来标识JMenuItem的全部内容。我已经尝试过racerDelete.remove(j),但它不起作用,我不知道为什么。

诀窍是读取错误消息,可能会说“变量j必须声明为final才能在匿名类中使用”。将代码更改为

    final JMenuItem j = new JMenuItem(r.getName());
    racerDelete.add(j);
    j.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            int reply = JOptionPane.showConfirmDialog(null,
                    "Are you sure you want to delete racer " + r.getName() + "?", "Delete?",
                    JOptionPane.YES_NO_OPTION);
            if (reply == JOptionPane.YES_OPTION){
                r.delete();
                racerDelete.remove(j);
            }

        }
    });

操作事件的源将是您单击的JMenuItem,因此您可以使用如下代码:

JMenuItem mi (JMenuItem)e.getSource();
menu.remove( mi );
ActionListener removeItem = (new ActionListener() 
{
    public void actionPerformed(ActionEvent e) 
    {
        JMenuItem mi = (JMenuItem)e.getSource();

        int reply = JOptionPane.showConfirmDialog(null,
                "Are you sure you want to delete racer " + mi.getText() + "?", "Delete?",
                JOptionPane.YES_NO_OPTION);

        if (reply == JOptionPane.YES_OPTION)
        {
            r.delete();
            racerDelete.remove(mi);
        }
    }
};


for (final Racer r : Racer.getAllRacers()) 
{
    JMenuItem j = new JMenuItem(r.getName());
    racerDelete.add(j);
    j.addActionListener(removeItem);
}
此外,不需要创建唯一的ActionListener。您可以使用以下代码创建共享侦听器:

JMenuItem mi (JMenuItem)e.getSource();
menu.remove( mi );
ActionListener removeItem = (new ActionListener() 
{
    public void actionPerformed(ActionEvent e) 
    {
        JMenuItem mi = (JMenuItem)e.getSource();

        int reply = JOptionPane.showConfirmDialog(null,
                "Are you sure you want to delete racer " + mi.getText() + "?", "Delete?",
                JOptionPane.YES_NO_OPTION);

        if (reply == JOptionPane.YES_OPTION)
        {
            r.delete();
            racerDelete.remove(mi);
        }
    }
};


for (final Racer r : Racer.getAllRacers()) 
{
    JMenuItem j = new JMenuItem(r.getName());
    racerDelete.add(j);
    j.addActionListener(removeItem);
}

是的,我这么做了,理论上应该行得通,但实际上不行。用户界面只是没有正确更新吗?发布的SSCE再现了这个问题。请注意,用“它不起作用”来描述您的问题对我们没有多大帮助。