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

One Java Swing PopupMenu for different JLists vs One Menu per JList

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

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

我想知道最好的方法是性能还是 "good-coding" 明智。为每个组件创建不同的弹出菜单还是使用相同的弹出菜单?

我正在使用以下代码找出它是哪个 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());
    }
});

使用此代码,我将在每次按下按钮时创建弹出菜单和列表的实例。这是 "best" 的方法还是我应该制作 2 个不同的弹出菜单?

感谢您的帮助, 内卡斯

One should remove one object from an array and the other should remove a different object from a different array).

您不应该使用数组。

Swing 使用经过修改的模型-视图-控制器 (MVC) 设计。基本上这意味着 JList 中的数据显示必须包含在 ListModel 中。所以如果你想改变 JList 你改变 ListModel.

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

所以您的基本代码是正确的,因为您获得了弹出窗口的调用程序。所以现在您需要做的就是获取 DefaultListModel:

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