diff --git a/swing/src/main/java/info/openrocket/swing/gui/widgets/SearchableAndGroupableComboBox.java b/swing/src/main/java/info/openrocket/swing/gui/widgets/SearchableAndGroupableComboBox.java index 64e4ef4c3..ec09b355c 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/widgets/SearchableAndGroupableComboBox.java +++ b/swing/src/main/java/info/openrocket/swing/gui/widgets/SearchableAndGroupableComboBox.java @@ -213,6 +213,7 @@ public class SearchableAndGroupableComboBox<G extends Group, T extends Groupable private JPopupMenu createGroupsPopup() { final JPopupMenu menu = new JPopupMenu(); + MenuItemMouseListener menuItemListener = new MenuItemMouseListener(); // Add the search field at the top menu.add(searchFieldGroups); @@ -226,10 +227,11 @@ public class SearchableAndGroupableComboBox<G extends Group, T extends Groupable super.paintComponent(g); // If the group contains the selected item, draw a checkbox if (containsSelectedItem(group, (T) SearchableAndGroupableComboBox.this.getSelectedItem())) { - g.drawString(CHECKMARK, CHECKMARK_X_OFFSET, getHeight() - CHECKMARK_Y_OFFSET); // Unicode for checked checkbox + g.drawString(CHECKMARK, CHECKMARK_X_OFFSET, getHeight() - CHECKMARK_Y_OFFSET); } } }; + groupMenu.addMouseListener(menuItemListener); List<T> itemsForGroup = itemGroupMap.get(group); if (itemsForGroup != null) { @@ -265,6 +267,30 @@ public class SearchableAndGroupableComboBox<G extends Group, T extends Groupable return menu; } + private class MenuItemMouseListener extends MouseAdapter { + private JMenu currentMenu; + + @Override + public void mouseEntered(MouseEvent e) { + if (e.getSource() instanceof JMenu) { + currentMenu = (JMenu) e.getSource(); + currentMenu.setPopupMenuVisible(true); + } + } + + @Override + public void mouseExited(MouseEvent e) { + if (currentMenu != null && !isMouseOverMenu(currentMenu, e.getPoint())) { + currentMenu.setPopupMenuVisible(false); + currentMenu = null; + } + } + + private boolean isMouseOverMenu(JMenu menu, Point point) { + return menu.getBounds().contains(SwingUtilities.convertPoint(menu.getParent(), point, menu)); + } + } + private JPopupMenu createSearchPopup() { final JPopupMenu menu = new JPopupMenu(); menu.setLayout(new BorderLayout());