Пользовательский JMenuItem

Можно ли создать собственный JMenuItem, содержащий список флажков? Примером является всплывающее меню фильтра Excel:

До сих пор то, что я сделал, выглядит следующим образом:

JPopupMenu headerPopup = new JPopupMenu();
JMenuItem clearfilter = new JMenuItem ("Clear Filter From Time");
JMenu filter = new JMenu("Number Filter");
filter.add(new JMenuItem("Equals.."));
filter.add(new JMenuItem("Not Equal.."));


JPanel checkBoxItems = new JPanel();

JCheckBox[] checkBoxes = new JCheckBox[200];
initList(checkBoxes);
JList list = new CheckBoxList();
list.setModel(new ListModel(checkBoxes));
JScrollPane scrollPane = new JScrollPane(list);

checkBoxItems.setLayout(new BorderLayout());
checkBoxItems.add(scrollPanel);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(1, 3));
buttonPanel.add(new JPanel());
buttonPanel.add(new JButton("Ok"));
buttonPanel.add(new JButton("Cancel"));
checkBoxItems.add(buttonPanel, BorderLayout.SOUTH);

headerPopup.add(clearfilter);
headerPopup.add(filter);
headerPopup.add(checkBoxItems);

Содержимое панели checkBoxItems представляет собой JList JCheckBox и две кнопки. Проблема заключается в том, что когда курсор входит внутрь панели, элемент меню «Числовой фильтр» все равно будет выбран, а его всплывающее меню все равно будет отображаться, даже если курсор уже находится на панели.

Я пробовал это, но не работал, как-то иначе?:

    checkBoxItems.addMouseListener(new MouseAdapter() 
    {
        @Override
        public void mouseEntered(MouseEvent e) 
        {
            filter.setArmed(false);
            filter.setSelected(false);
        }
    });

person imarefe    schedule 08.03.2013    source источник
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 08.03.2013


Ответы (1)


  • используйте JCheckBoxMenuItem, поместите их в ButtonGroup

  • checkBoxItems.addMouseListener(new MouseAdapter() должно быть ChangeListener вместе с getButtonModel

  • эти события реализованы в API напрямую, добавлять MouseListener не требуется,

  • ButtonModel требуется только для части mouse and key events, которые не реализованы или реализованы неудобным образом в API

person mKorbel    schedule 08.03.2013
comment
JCheckBoxMenuItem работает хорошо, но наличие большого количества JCheckBoxMenuItem в меню кажется неуместным. - person imarefe; 13.03.2013