在扩展JMenu的类中,我创建了一个新的JPopupMenu.Separator对象并将其添加到菜单中:
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 :(得分:1)
您的boolean vis
字段可能是public
,但是“只有在写入操作发生之前,一个线程的写入结果才能保证对另一个线程的读取可见读取操作。“创建字段volatile
,因为“写入易失性字段发生在每次后续读取同一字段之前。”有关详细信息,请参阅Memory Consistency Properties。