0

我有一个 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),它不起作用,我不知道为什么。

4

2 回答 2

1

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

JMenuItem mi (JMenuItem)e.getSource();
menu.remove( mi );

此外,无需创建唯一的 ActionListener。您可以使用以下代码创建共享侦听器:

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);
}
于 2013-10-11T21:08:45.503 回答
1

诀窍是阅读错误消息,它可能会说“变量 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);
            }

        }
    });
于 2013-10-11T20:41:00.613 回答