Java 如果只提供与JMenuItem关联的字符串,是否可以从JMenuItem中删除JMenuItem
我有一个JMenu,其中填充了来自具有侦听器的数据库的JMenuItems,其中一个侦听器是从数据库中删除条目(如果选中)。发生这种情况时,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(
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再现了这个问题。请注意,用“它不起作用”来描述您的问题对我们没有多大帮助。