JavaFX按钮垃圾邮件MouseExit和MouseEntered



我试图在鼠标进入节点时禁用一个按钮,并在鼠标离开节点时再次启用它。按钮响应MouseEvent.ANY,handle方法获取事件类型并相应地处理它。即使我没有移动光标,println也会显示源源不断的信息:

鼠标已退出(_E(鼠标退出目标鼠标居中MOUSE_ENTERED_TARGET鼠标已退出(_E(鼠标退出目标鼠标居中MOUSE_ENTERED_TARGET鼠标已退出(_E(鼠标退出TARG

这会使按钮闪烁。

public void handle(MouseEvent me) {
System.out.println(me.getEventType());
if(me.getEventType() == MouseEvent.MOUSE_ENTERED_TARGET || me.getEventType() == MouseEvent.MOUSE_MOVED) {
nejButton.setDisable(true);
}
else if((me.getEventType() == MouseEvent.MOUSE_EXITED) || (me.getEventType() == MouseEvent.MOUSE_EXITED_TARGET) )nejButton.setDisable(false);
}

看起来禁用Node意味着鼠标不再被认为在其范围内。这可能有点牵强,但我相信Node#disabled属性记录了这一点

指示此Node是否已禁用。如果disable在其自身或其在场景图中的祖先之一上被设置为true,则Node将被禁用。

禁用的Node应该以不同的方式呈现自己,以向用户指示其禁用状态。这种被禁用的呈现依赖于Node的实现。默认情况下,javafx.scene.shape中包含的形状类不实现这种渲染,因此使用形状处理输入的应用程序必须自己实现适当的禁用渲染。但是,javafx.scene.control中定义的用户界面控件将实现禁用的敏感渲染。

禁用的Node不会接收鼠标或按键事件[增加强调]

我相信,当你禁用Node时,鼠标";退出";因为所述CCD_ 13不再有资格接收鼠标事件。无论是否移动鼠标,都会发生这种情况。然后你的代码对鼠标做出反应;退出";并启用Node。然而,由于现在启用的Node再次有资格接收鼠标事件,并且您将鼠标保持在同一位置,因此鼠标";输入";16。然后,您的代码对鼠标"做出反应;输入";CCD_ 17并再次禁用它——导致无休止的循环。

我怀疑没有办法解决这种行为1

话虽如此,我觉得想要的进球很奇怪。只有当鼠标悬停在Button上时,才禁用CCD_18,你想告诉用户什么?这似乎传达了">来点击这个按钮。。。开玩笑";。这似乎不是一个愉快的用户体验。


1.由于禁用的节点不会接收鼠标事件,因此可能会认为这种行为是一个错误。然而,阻止这种循环的发生对您的情况没有帮助;将鼠标移出按钮不会触发鼠标退出事件,无论是否存在"退出"事件;在悬停时被禁用";鼠标退出事件是否已启动。我也倾向于认为这种行为是而不是错误

最新更新