Fix JMenu deselection issue
This commit is contained in:
		
							parent
							
								
									a38230a05e
								
							
						
					
					
						commit
						4dbbc0f4fd
					
				@ -24,7 +24,6 @@ import javax.swing.JButton;
 | 
			
		||||
import javax.swing.JComboBox;
 | 
			
		||||
import javax.swing.JLabel;
 | 
			
		||||
import javax.swing.JPanel;
 | 
			
		||||
import javax.swing.SwingUtilities;
 | 
			
		||||
import java.awt.Component;
 | 
			
		||||
import java.awt.event.ActionEvent;
 | 
			
		||||
import java.awt.event.ActionListener;
 | 
			
		||||
 | 
			
		||||
@ -211,11 +211,40 @@ public class GroupableAndSearchableComboBox<G extends Group, T extends Groupable
 | 
			
		||||
		return new ArrayList<>(uniqueItems);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	static class DeselectMenuListener extends MouseAdapter {
 | 
			
		||||
		final List<JMenu> groupMenus;
 | 
			
		||||
		final JMenu ownMenu;
 | 
			
		||||
 | 
			
		||||
		DeselectMenuListener(List<JMenu> groupMenus, JMenu ownMenu) {
 | 
			
		||||
			this.groupMenus = groupMenus;
 | 
			
		||||
			this.ownMenu = ownMenu;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		public void mouseEntered(MouseEvent e) {
 | 
			
		||||
			super.mouseEntered(e);
 | 
			
		||||
			SwingUtilities.invokeLater(() -> {
 | 
			
		||||
				for (JMenu groupMenu : groupMenus) {
 | 
			
		||||
					if (groupMenu != ownMenu) {
 | 
			
		||||
						groupMenu.setSelected(false);
 | 
			
		||||
						groupMenu.setPopupMenuVisible(false);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if (ownMenu != null) {
 | 
			
		||||
					ownMenu.setSelected(true);
 | 
			
		||||
					ownMenu.setPopupMenuVisible(true);
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private JPopupMenu createGroupsPopup() {
 | 
			
		||||
		final JPopupMenu menu = new JPopupMenu();
 | 
			
		||||
		final List<JMenu> groupMenus = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
		// Add the search field at the top
 | 
			
		||||
		menu.add(searchFieldGroups);
 | 
			
		||||
		searchFieldGroups.addMouseListener(new DeselectMenuListener(groupMenus, null));
 | 
			
		||||
		menu.addSeparator();
 | 
			
		||||
 | 
			
		||||
		// Fill the menu with the groups
 | 
			
		||||
@ -244,13 +273,16 @@ public class GroupableAndSearchableComboBox<G extends Group, T extends Groupable
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			groupMenus.add(groupMenu);
 | 
			
		||||
			menu.add(groupMenu);
 | 
			
		||||
			groupMenu.addMouseListener(new DeselectMenuListener(groupMenus, groupMenu));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Extra widgets
 | 
			
		||||
		if (extraGroupPopupWidgets != null) {
 | 
			
		||||
			for (Component widget : extraGroupPopupWidgets) {
 | 
			
		||||
				menu.add(widget);
 | 
			
		||||
				widget.addMouseListener(new DeselectMenuListener(groupMenus, null));
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user