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.JComboBox;
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import javax.swing.SwingUtilities;
|
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
|
@ -211,11 +211,40 @@ public class GroupableAndSearchableComboBox<G extends Group, T extends Groupable
|
|||||||
return new ArrayList<>(uniqueItems);
|
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() {
|
private JPopupMenu createGroupsPopup() {
|
||||||
final JPopupMenu menu = new JPopupMenu();
|
final JPopupMenu menu = new JPopupMenu();
|
||||||
|
final List<JMenu> groupMenus = new ArrayList<>();
|
||||||
|
|
||||||
// Add the search field at the top
|
// Add the search field at the top
|
||||||
menu.add(searchFieldGroups);
|
menu.add(searchFieldGroups);
|
||||||
|
searchFieldGroups.addMouseListener(new DeselectMenuListener(groupMenus, null));
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
|
|
||||||
// Fill the menu with the groups
|
// 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);
|
menu.add(groupMenu);
|
||||||
|
groupMenu.addMouseListener(new DeselectMenuListener(groupMenus, groupMenu));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extra widgets
|
// Extra widgets
|
||||||
if (extraGroupPopupWidgets != null) {
|
if (extraGroupPopupWidgets != null) {
|
||||||
for (Component widget : extraGroupPopupWidgets) {
|
for (Component widget : extraGroupPopupWidgets) {
|
||||||
menu.add(widget);
|
menu.add(widget);
|
||||||
|
widget.addMouseListener(new DeselectMenuListener(groupMenus, null));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user