Java 强制JPOppMenu在其所有者JFrame上禁用悬停效果?

Java 强制JPOppMenu在其所有者JFrame上禁用悬停效果?,java,swing,hover,jtable,jpopupmenu,Java,Swing,Hover,Jtable,Jpopupmenu,当我在JFrame中右键单击一个JTable时,我会显示一个JPopupMenu。如果我让这个JPopupMenu保持原样并用鼠标移动到JTable,我仍然可以在它的行上悬停 这不是Windows应用程序的默认行为。在正常情况下,如果程序中出现弹出菜单,则会阻止弹出所有者窗口上的任何悬停操作 我可以在Java中做同样的事情吗?解决此问题的一种方法是在一个GUI元素中设置一个实例变量,以标记是否启用悬停事件。我已经在下面展示了这是如何工作的,但它的形式并不完整,您还需要在JPopupMenu关闭时

当我在JFrame中右键单击一个JTable时,我会显示一个JPopupMenu。如果我让这个JPopupMenu保持原样并用鼠标移动到JTable,我仍然可以在它的行上悬停

这不是Windows应用程序的默认行为。在正常情况下,如果程序中出现弹出菜单,则会阻止弹出所有者窗口上的任何悬停操作


我可以在Java中做同样的事情吗?

解决此问题的一种方法是在一个GUI元素中设置一个实例变量,以标记是否启用悬停事件。我已经在下面展示了这是如何工作的,但它的形式并不完整,您还需要在JPopupMenu关闭时重新启用悬停,并在触发悬停效果之前检查
enable\u hover
字段的状态

public MyTable extends JTable {

    private boolean ENABLE_HOVER = true;

    public MyTable() {
    ...
    this.addMouseListener(new MouseListener(){
        ...
        public void mouseClicked(MouseEvent e) {
            if (isRightClick(e)) {
                setHoverEnabled(false);
                showJPopupMenu();
            }
        }
    });
    }

    protected void setHoverEnabled(final boolean hover) {
        this.ENABLE_HOVER = hover;
    }
}

另一种可能更适合于禁用大量启用的元素的方法是在玻璃窗处截获事件。下面给出了一个如何工作的示例。但请注意,如果您的接口已经构建,则可能需要对组件类进行重大的重新调整


您需要截获玻璃窗格中的所有事件,如果启用了悬停(未显示弹出菜单),则将事件传递给相应的组件。否则,如果禁用悬停,并且在JPopupMenu上发生的MouseeEvent仅传递给JPopupMenu。

我认为这是弹出窗口或工具提示的正常windows行为。你描述的是一个模态对话框的行为。@装满鳗鱼的气垫船:这是错误的。只需打开Windows记事本,在其内部单击鼠标右键即可显示“剪切/复制/粘贴”弹出窗口。保持原样,然后在记事本的菜单栏上移动鼠标,并尝试将鼠标悬停在菜单栏按钮上。。。不会出现悬停效果。但是在Java应用程序中,您仍然可以在这样的JMenubar控件上悬停。如果您想禁用菜单效果,您需要在更高级别的容器上设置鼠标侦听器,请参阅下面的答案。非常感谢,但是除了JTable之外,用户还可以悬停在许多其他控件上。我的想法是在所有控件上使用个性化的工具提示,因此在控件上悬停除了悬停效果外,还会显示这些提示,使弹出窗口显示时看起来很糟糕。我需要一些类似于显示弹出窗口时的内容:myFrame.setEnabled(false)。。。类似的东西,但这也会禁用弹出窗口。