一个Java Swing PopupMenu用于不同的JLists与每个JList的一个菜单

时间:2016-05-15 16:06:07

标签: java swing jlist popupmenu

我创建了一个包含2个菜单项的弹出菜单:编辑和删除。然后,我将此菜单添加到2个不同的JLists中。

单击编辑或删除的结果在JLists之间是不同的,因为它们引用不同的对象(删除菜单项:一个应从数组中删除一个对象,另一个应从另一个数组中删除另一个对象)。

我想知道哪种方式最好,性能还是"良好的编码"明智的。为每个组件创建不同的弹出菜单或使用相同的弹出菜单?

我使用以下代码找出它是哪个JList:

JPopupMenu popupMenu = new JPopupMenu("Menu");
addPopup(listShowSources, popupMenu);
addPopup(listShowESS, popupMenu);


JMenuItem menuItemEdit = new JMenuItem("Edit");
popupMenu.add(menuItemEdit);

JMenuItem menuItemRemove = new JMenuItem("Remove");
popupMenu.add(menuItemRemove);
menuItemRemove.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseReleased(MouseEvent arg0) {
        Component c = (Component)arg0.getSource();
        JPopupMenu popup = (JPopupMenu)c.getParent();
        JList<String> list = (JList <String> )popup.getInvoker();
        System.out.println(list.getName());
    }
});

使用此代码,每次按下按钮,我都会创建弹出菜单和列表的实例。这是最好的&#34;这样做的方法还是我应该制作两个不同的弹出菜单?

谢谢你的帮助, Nhekas

1 个答案:

答案 0 :(得分:2)

  

一个应该从一个数组中删除一个对象,另一个应该从另一个数组中删除另一个对象。)

你不应该使用数组。

Swing使用修改后的模型 - 视图 - 控制器(MVC)设计。基本上这意味着JList中的数据显示必须包含在ListModel中。因此,如果您想更改JList,请更改ListModel

因此不需要数组(即您不希望将数据保存在两个位置)。 DefaultListModel具有允许您直接更新模型的方法。

所以你的基本代码是正确的,因为你得到了弹出窗口的调用者。所以现在你需要做的就是获得DefaultListModel

DefaultListModel model = (DefaultListModel)list.getModel();
model.remove(...);