2016-03-08 7 views
1

В моей Java приложения, я использую popupMenuWillBecomeVisible() событий, чтобы решить, какие меню-элементы в моей JPopupMenu будет включен/выключен/видимый/скрытый и т.д.Есть ли способ отменить всплывающее меню в popupMenuWillBecomeVisible()?

Я использовал JPopupMenu как контекстное меню правой кнопки мыши JList, и я решаю состояние элементов меню, в зависимости от того, какой элемент в списке был щелкнут правой кнопкой мыши.

Все это работает нормально. Единственное, что у меня есть, - это случай, когда список пуст или щелчок правой кнопкой мыши был вызван, когда не было выбрано ни одного элемента.

В этом случае, я надеюсь, что я мог бы отменить появление JPopupMenu изнутри popupMenuWillBecomeVisible() события, так как это, где я в настоящее время выполнять свои существующие тесты.

Есть ли способ сделать это? Возможно, какой-то способ «поглотить» событие?

Если нет, возможно, мой единственный вариант - попробовать альтернативы, например перемещать логику тестирования в другом месте, до щелчка правой кнопкой мыши.

Тем не менее, мое предпочтение на этом этапе состояло в том, чтобы сохранить логику в popupMenuWillBecomeVisible(), если это не будет невозможно.

У кого-нибудь есть идеи?

+2

В зависимости от ваших потребностей вы можете просто заполнить всплывающие окна своими опциями и просто отключить те, у которых нет допустимого контекста (вместо добавления/удаления), поэтому в случае, если нет параметров доступно, или у вас есть серия отключенных опций – MadProgrammer

ответ

2

SwingUtilities.InvokeLater будет ждать завершения всех операций AWT до запуска runnable, что означает, что эта runnable будет вызвана после завершения события popupMenuWillBecomeVisible, и всплывающее меню будет видимым или в очереди для окрашивания.

 final JPopupMenu popupMenu = new JPopupMenu(); 
     popupMenu.addPopupMenuListener(new PopupMenuListener() { 
      @Override 
      public void popupMenuWillBecomeVisible(final PopupMenuEvent e) { 
       SwingUtilities.invokeLater(new Runnable() { 
        @Override 
        public void run() { 
         ((JPopupMenu)e.getSource()).setVisible(false); 
        } 
       }); 
      }