Одно всплывающее меню Java Swing для разных JList против одного меню для каждого JList

Я создал всплывающее меню с двумя пунктами меню: «Изменить» и «Удалить». А затем я добавил это меню в 2 разных списка JList.

Результат нажатия кнопки «Изменить» или «Удалить» в JList различается, поскольку они относятся к разным объектам (элемент меню «Удалить»: один должен удалить один объект из массива, а другой — другой объект из другого массива).

Мне интересно, как лучше всего это сделать, с точки зрения производительности или «хорошего кодирования». Создать отдельное всплывающее меню для каждого компонента или использовать одно и то же всплывающее меню?

Я использую следующий код, чтобы узнать, какой это 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 разных всплывающих меню?

Спасибо за помощь, Некас


person Nhekas    schedule 15.05.2016    source источник


Ответы (1)


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

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

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

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

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

DefaultListModel model = (DefaultListModel)list.getModel();
model.remove(...);
person camickr    schedule 15.05.2016
comment
спасибо за ваш ответ, но я использую список моделей. Однако мне нужны данные в массиве из-за других операций моего кода. Я использую эти Jlists в основном для отображения того, сколько объектов у меня есть в каждом массиве, чтобы пользователь мог выбрать, какой из них ему нужен для других операций. При этом я использую модель списка для удаления и вставки элементов в эти JList, как вы и сказали. Однако, по вашему мнению, я должен сделать это так, как показано в коде в вопросе, или я должен создать 2 разных всплывающих меню в начале? Спасибо! - person Nhekas; 15.05.2016
comment
I do need the data on a Array due to other operations of my code — когда вам нужны данные из модели, вы используете метод elementAt(...) из DefaultListModel. Поэтому, когда пользователь выбирает элемент для обработки, вы получаете данные из файла ListModel. Не пытайтесь сохранить отдельный массив, вы можете легко перебирать все элементы в ListModel или получать доступ к одному элементу за раз. Отличие заключается в том, что вы используете метод с параметром вместо массива с индексом. Если вы правильно спроектируете приложение, в двух меню не будет необходимости. - person camickr; 15.05.2016
comment
Ok! большое спасибо за ваш ответ и подробное объяснение! Это было очень полезно и ответило на мой вопрос! - person Nhekas; 15.05.2016