У меня есть JPopupMenu
, который содержит внутренний JMenu
и разделитель с addSeparator()
. Из-за некоторой нечетной обработки я добавил MouseListener
в JPopupMenu
, что делает его невидимым на мероприятии mouseExited
. Это прекрасно работает, за исключением того, что, когда мышь пытается пересечь разделитель, он запускает событие (хотя является суперкомпонентом).Триггеры события MouseExited при пересечении внутреннего разделителя?
Если я удаляю линию addSeparator()
, она работает должным образом.
Есть ли способ обойти это? Или я не правильно настроил слушателя?
код похож на следующее:
JPopupMenu popupMenu = new JPopupMenu();
JMenu innerMenu = new JMenu("Inner");
// ... add JMenuItems
popupMenu.add(innerMenu);
popupMenu.addSeparator();
popupMenu.add(new JMenuItem("Exit"));
popupMenu.addMouseListener(new MouseAdapter() {
@Override
public void mouseExited(MouseEvent e) {
popupMenu.setVisible(false);
}
});
Полный компилируется Пример
Просто комментировать и раскомментироватьpopupMenu.addSeparator()
линии замечать различные модели поведения
public class Test {
public static void main(String[] args) throws Exception {
if(!SystemTray.isSupported()) {
throw new UnsupportedOperationException("SystemTray is not supported.");
}
final TrayIcon trayIcon = new TrayIcon(ImageIO.read(new File("resources/icon.gif")));
final JPopupMenu popupMenu = new JPopupMenu();
JMenu intervalMenu = new JMenu("Interval");
ButtonGroup itemGroup = new ButtonGroup();
JRadioButtonMenuItem oneSecondMenuItem = new JRadioButtonMenuItem("1 sec");
itemGroup.add(oneSecondMenuItem);
JRadioButtonMenuItem twoSecondMenuItem = new JRadioButtonMenuItem("2 sec");
itemGroup.add(twoSecondMenuItem);
intervalMenu.add(oneSecondMenuItem);
intervalMenu.add(twoSecondMenuItem);
popupMenu.add(intervalMenu);
popupMenu.addSeparator();
JMenuItem exitMenuItem = new JMenuItem("Exit");
exitMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
SystemTray.getSystemTray().remove(trayIcon);
System.exit(0);
}
});
popupMenu.add(exitMenuItem);
//Thanks to Artem Ananiev for this implementation idea
//https://weblogs.java.net/blog/ixmal/archive/2006/05/using_jpopupmen.html
trayIcon.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
if(e.getButton() == MouseEvent.BUTTON3) {
popupMenu.setLocation(e.getX() - 40, e.getY() - 40);
popupMenu.setInvoker(popupMenu);
popupMenu.setVisible(true);
}
}
});
popupMenu.addMouseListener(new MouseAdapter() {
@Override
public void mouseExited(MouseEvent e) {
popupMenu.setVisible(false);
}
});
SystemTray.getSystemTray().add(trayIcon);
}
}
Опубликовать Ваше 'SSCCE', демонстрирующую проблему. – camickr
@camickr Сделано. Сделал это как можно более кратким, хотя это запутанная настройка. – asteri