2016-05-15 2 views
0

Я создал всплывающее меню с двумя пунктами меню: «Редактирование и удаление». И затем я добавил это меню в два разных 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

ответ

2

следует удалить один объект из массива, а другой должен удалить другой объект из другого массива).

Вы не должны использовать Массивы.

Swing использует модифицированную конструкцию Model-View-Controller (MVC). В основном это означает, что отображение данных в JList должно содержаться в ListModel. Поэтому, если вы хотите изменить JList, вы меняете ListModel.

Таким образом, нет необходимости в массиве (т. Е. Вы не хотите хранить данные в двух местах). У DefaultListModel есть методы, позволяющие напрямую обновлять модель.

Итак, ваш базовый код верен тем, что вы получаете invoker всплывающего окна. Итак, теперь все, что вам нужно сделать, это получить DefaultListModel:

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

благодарит за ваш ответ, но я использую модели списка. Однако мне нужны данные в массиве из-за других операций моего кода. Я использую эти Jlists в основном для отображения количества объектов, которые у меня есть в каждом массиве, поэтому пользователь может выбрать, какой из них нужен для других операций. Это говорит о том, что я использую модель списка для удаления и вставки элементов в эти JLists, как вы сказали. Однако, на ваш взгляд, следует ли мне это делать, как показано в коде в вопросе, или мне нужно создать 2 разных всплывающих меню в начале? Благодаря! – Nhekas

+0

'Мне нужны данные в массиве из-за других операций моего кода' - когда вам нужны данные из модели, вы используете метод elementAt (...)' из DefaultListModel. Поэтому, когда пользователь выбирает элемент для обработки, это время, когда вы получаете данные из «ListModel». Не пытайтесь сохранить отдельный массив, вы можете легко перебирать все элементы в ListModel или получать доступ к одному элементу за раз. В другом случае вы используете метод с параметром вместо использования массива с индексом. Если вы правильно разработали приложение, нет необходимости в двух меню. – camickr

+0

ОК! Большое спасибо за ваш ответ и подробное объяснение! Это было очень полезно и ответили на мой вопрос! – Nhekas

Смежные вопросы