当我右键单击 JFrame 中的 JTable 时,我会显示一个 JPopupMenu。如果我让这个 JPopupMenu 保持原样并用鼠标移动到 JTable,我仍然可以将鼠标悬停在它的行上。
这不是 Windows 应用程序的默认行为。在正常情况下,如果程序中出现弹出菜单,它会阻止弹出所有者窗口上的任何悬停操作。
我可以在 Java 中做同样的事情吗?
当我右键单击 JFrame 中的 JTable 时,我会显示一个 JPopupMenu。如果我让这个 JPopupMenu 保持原样并用鼠标移动到 JTable,我仍然可以将鼠标悬停在它的行上。
这不是 Windows 应用程序的默认行为。在正常情况下,如果程序中出现弹出菜单,它会阻止弹出所有者窗口上的任何悬停操作。
我可以在 Java 中做同样的事情吗?
另一种可能更适合禁用大量启用的元素的方法是拦截玻璃窗格中的事件。此处显示了这可能如何工作的示例。请注意,如果您的界面已经构建,则可能需要对组件类进行大量重新调整。
您将需要拦截玻璃窗格中的所有事件,如果启用了悬停(未显示弹出菜单),您会将事件传递给适当的组件。否则,如果禁用悬停并且在 JPopupMenu 上发生的 MouseEvent 仅传递给 JPopupMenu。
解决此问题的一种方法是在您的一个 GUI 元素中设置一个实例变量来标记是否启用悬停事件。我在下面展示了它是如何工作的,但它不是完整的形式,当 JPopupMenu 被关闭时,您还需要重新启用悬停,并ENABLE_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;
}
}