在Linux中触发Java弹出窗口

10

我的应用程序支持鼠标右键按下并拖动(还有左键按下并拖动执行不同的操作)。然而,在Linux上运行时,弹出菜单似乎是由mousePressed触发而不是mouseReleased。这会导致每次我按右键进行拖动时,都会触发弹出菜单(与Windows不同,在Windows上是在mouseReleased时触发)。

有什么想法可以解决这个问题吗?

谢谢。

编辑:发布代码

弹出菜单代码

// this is called from mousePressed and mouseReleased
if (e.isPopupTrigger() && !e.isConsumed()) {
    // show the popup menu
}

这段代码是在鼠标右键按下/拖动时调用的(这是第三方代码,但它是开源的,因此我可以根据需要进行更改)

// this is called on all mouse events
if (buttonAction.mouseButton != 0)
{
    // handle the event
}
3个回答

13

是的,使用 isPopupTrigger(),如这里所示。

补充说明:

在Linux中,似乎会在mousePressed时触发isPopupTrigger

是的,在Mac OS X上也是一样的。您必须同时从mousePressed()mouseReleased()调用isPopupTrigger()。在GraphPanel中有一个相关的示例。


1
我发现,在Linux上,isPopupTrigger在鼠标按下时被触发。 - Jeff Storey
那么,如果我正在使用一个第三方库,在按下并拖动鼠标右键时执行一些非弹出操作,这是否意味着在尝试执行其他操作时,弹出菜单将始终显示? - Jeff Storey
我刚在Windows上尝试了GraphPanel,我明白你的意思。第三方API是否公开其选择模型? - trashgod
是的,我可以完全访问代码,所以我可以修改与选择相关的任何内容。 - Jeff Storey
我认为没有办法让一个手势触发两种不同的行为,除非有其他提示。使用consume()/isConsumed()可能是一种方法,但你总可以占用第三个按钮或使用修饰键作为信号来解决意图。在Mac OS X上,isPopupTrigger()返回true当按下控制键时按下按钮一。 - trashgod
是的,我可能需要构建一些更高级的机制,比如按住控制键。 - Jeff Storey

1

MouseEvent.isPopupTrigger()。返回此鼠标事件是否为平台的弹出菜单触发事件。

编辑 - :您需要在Linux的mousePressed和Windows的mouseReleased中进行检查。


好的,我正在做这件事。我的问题是每次我按右键进行右键/拖动操作时,都会弹出菜单(我不想要)。 - Jeff Storey
你介意贴出这两个方法的代码吗?没有那些代码很难确定你在检查之前/之后做了什么。 - user512802
根据您发布的逻辑,它总是会显示弹出菜单。您正在检查是否为弹出触发器(它将是),然后您的注释读取“//显示弹出菜单”。如果您不想显示弹出菜单,则只需在该条件内返回而不是显示弹出菜单即可。 - user512802
除非您计划在鼠标按下或释放后执行更多操作,否则可以消耗事件并执行所需操作。因此,代码可能如下所示:if(e.isPopupTrigger()){e.consume();} //执行其他操作 - user512802
我可以做的一件事是在mousePressed上设置一个标志,然后在mouseReleased上显示弹出菜单,如果事件没有被消耗的话。 - Jeff Storey

1

我认为你的情况下应该统一弹出窗口的显示时间和位置。如果存在拖拽事件,则应避免在按下事件中编写显示弹出窗口的逻辑(然后也要在按下事件中编写显示弹出窗口的逻辑)。有些用户喜欢在按住弹出按钮时浏览弹出菜单,而其他一些用户则不在意或不知道。但是,在拖动时无法浏览弹出菜单,除非添加额外的代码。

我的方法是管理逻辑,始终在松开事件中显示弹出窗口。进入拖动后的松开事件应足够了解弹出窗口不应可见。当然,如果可以更改和修改源代码,那就总是可以这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接