一个Java Swing PopupMenu适用于不同的JLists对每个JList一个菜单
问题描述:
我创建了一个带有2个菜单项的弹出菜单:编辑和删除。然后,我将这个菜单添加到2个不同的JLists。一个Java Swing PopupMenu适用于不同的JLists对每个JList一个菜单
单击编辑或删除的结果在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());
}
});
有了这个代码,我将创建弹出菜单和列表每次我按下按钮时的情况。这是做到这一点的“最佳”方式,还是应该制作2个不同的弹出式菜单?
谢谢你的帮助, Nhekas
答
每个人都应该从一个数组中删除一个对象和另一应该从不同的数组中删除一个不同的对象)。
你不应该使用数组。
Swing使用经过修改的模型 - 视图 - 控制器(MVC)设计。基本上这意味着JList
中的数据显示必须包含在ListModel
中。所以如果你想改变JList
你改变ListModel
。
所以不需要数组(即你不想将数据保存在两个地方)。 DefaultListModel
具有允许您直接更新模型的方法。
所以你的基本代码是正确的,因为你得到了弹出窗口的调用者。所以,现在你需要做的就是在DefaultListModel
:
DefaultListModel model = (DefaultListModel)list.getModel();
model.remove(...);
感谢您的回复,但我使用列表模式。但是,由于我的代码的其他操作,我确实需要数组上的数据。我主要使用这些Jlists来显示每个数组中有多少个对象,以便用户可以选择其他操作所需的对象。 这就是说,我使用列表模型来移除项目并将其插入到这些JLists中,就像您所说的那样。 然而,在你看来,我应该像我在问题中的代码中所示那样做,还是应该在开始时创建2个不同的弹出式菜单?谢谢! – Nhekas
'因为我的代码的其他操作,我确实需要数组上的数据 - 当您需要来自模型的数据时,则使用DefaultListModel中的'elementAt(...)'方法。所以当用户选择一个项目进行处理时,那就是你从'ListModel'获取数据的时间。不要试图保留一个单独的数组,您可以轻松遍历ListModel中的所有项目或一次访问一个项目。不同的是,您使用带参数的方法而不是使用带索引的数组。如果您正确设计应用程序,则不需要两个菜单。 – camickr
好!非常感谢您的回答和详尽的解释!这非常有用,并回答了我的问题! – Nhekas