JComponent.setVisible()未成功隐藏OS X上的分隔符

时间:2016-01-15 14:57:47

标签: java macos swing jcomponent jpopupmenu

在扩展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%。在添加invokeLaterrevalidaterepaint之后,似乎不再是这种情况,所有这些都是在其他各种StackOverflow帖子中推荐的,但没有解决问题。

我已经进行了大量登录,代码肯定会调用setVisible,而vis具有预期值 - 我只是没有看到这反映在菜单的行为中。

我的代码有什么问题,为什么它依赖于平台?

1 个答案:

答案 0 :(得分:1)

您的boolean vis字段可能是public,但是“只有在写入操作发生之前,一个线程的写入结果才能保证对另一个线程的读取可见读取操作。“创建字段volatile,因为“写入易失性字段发生在每次后续读取同一字段之前。”有关详细信息,请参阅Memory Consistency Properties