В классе, который простирается 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
имеет ожидаемое значение - я просто не вижу, чтобы это отражалось в поведении меню.
Что не так с моим кодом и почему оно зависит от платформы?
Попробуйте поместить revalidate() и перекрасить() внутри invokeLater(). – whiskeyspider
Все еще не работает. – UtterlyConfused
Почему бы просто не удалить разделитель, если он не должен отображаться? –