2016-01-15 8 views
1

В классе, который простирается JMenu, я создал новый объект JPopupMenu.Separator и добавить его в меню:JComponent.setVisible() не успешно скрыть разделитель на OS X

if (separator == null) 
    { 
     separator = new JPopupMenu.Separator() 
     this.add(separator); 
    } 

Затем в различных места, где вещи будут добавлены в/удалены из меню, я вызываю метод updateSeparatorVisibility определяются следующим образом:

private void updateSeparatorVisibility() 
{ 
    if (separator != null) 
    { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() 
      { 
       // vis is some public boolean 
       separator.setVisible(vis); 
      } 
     }); 

     this.revalidate(); 
     this.repaint(); 
    } 
} 

Это будет называться в то время как меню закрывается, и когда я снова открыть меню, я ожидаю увидеть изменения в видимость разделителя.

В Windows это работает отлично. На Mac разделитель будет меняться от невидимого до видимого, когда это будет необходимо, но после этого не изменится на невидимое. Фактически, я раньше видел изменение видимости с вероятностью 50%. Это не похоже на то, что после добавления invokeLater, revalidate и repaint, все из которых были рекомендованы в других сообщениях StackOverflow, но не устранили проблему.

Я поместил много записей и код определенно вызывает setVisible, когда он должен и vis имеет ожидаемое значение - я просто не вижу, чтобы это отражалось в поведении меню.

Что не так с моим кодом и почему оно зависит от платформы?

+0

Попробуйте поместить revalidate() и перекрасить() внутри invokeLater(). – whiskeyspider

+0

Все еще не работает. – UtterlyConfused

+0

Почему бы просто не удалить разделитель, если он не должен отображаться? –

ответ

1

Вашего boolean vis поля может быть public, но «Результаты записи по одной нити гарантированно будет видны для чтения другого потока, только если операция записи происходит, перед тем операции чтения.» Создайте поле volatile, потому что «Запись в нестабильное поле происходит до при каждом последующем чтении этого же поля». См. Memory Consistency Properties.

+0

Я, вероятно, должен делать это, как вы говорите, но из регистрации я знаю, что логическое значение принимает правильное значение при входе в EDT. – UtterlyConfused