From 4dbbc0f4fd8fd232b47c7d15eb26356db8bec2c1 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Sun, 11 Aug 2024 12:14:25 +0200 Subject: [PATCH] Fix JMenu deselection issue --- .../swing/gui/configdialog/MaterialPanel.java | 1 - .../GroupableAndSearchableComboBox.java | 32 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/swing/src/main/java/info/openrocket/swing/gui/configdialog/MaterialPanel.java b/swing/src/main/java/info/openrocket/swing/gui/configdialog/MaterialPanel.java index bd85cbd42..2d7b92cf9 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/configdialog/MaterialPanel.java +++ b/swing/src/main/java/info/openrocket/swing/gui/configdialog/MaterialPanel.java @@ -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; diff --git a/swing/src/main/java/info/openrocket/swing/gui/widgets/GroupableAndSearchableComboBox.java b/swing/src/main/java/info/openrocket/swing/gui/widgets/GroupableAndSearchableComboBox.java index 456feae42..3b27c3c33 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/widgets/GroupableAndSearchableComboBox.java +++ b/swing/src/main/java/info/openrocket/swing/gui/widgets/GroupableAndSearchableComboBox.java @@ -211,11 +211,40 @@ public class GroupableAndSearchableComboBox(uniqueItems); } + static class DeselectMenuListener extends MouseAdapter { + final List groupMenus; + final JMenu ownMenu; + + DeselectMenuListener(List 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 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