由于Mac 与 Windows 的操作模式问题,两者弹出触发器的时机不一样。
“
上下文菜单
上 下文菜单在Java中称为弹出菜单,Mac OS X平台完全支持这种菜单。在Mac OS X上,上下文菜单可以通过Control-click键或者right-click来触发。请注意,虽然Control-click和right- click会产生相同的结果,但它们是不同的鼠标事件。在Windows平台上,鼠标的右键是上下文菜单的标准触发器。
上下文菜单触发器的不同可能会导致一些零碎和有条件执行的代码。这两种触发器的一个重要的共同点就是使用鼠标点击。同样地,我们也有一个好方法来保证您的程序可以解析正确的上下文菜单出发器,那就是通过调用java.awt.event.MouseEvent.isPopupTrigger方法来请求AWT进行这个解析。
上述的方法在java.awt.event.MouseEvent包中定义,因为当某个构件上的鼠标事件被检测到时,需要在该构件的java.awt.event.MouseListener这个鼠标事件侦听方法中激活上下文菜单。重要的是如何以及何时可以检测正确的事件,在Mac OS X平台上,弹出触发器被设定为MOUSE_PRESSED,而在Windows上则被设定为MOUSE_RELEASED,即鼠标松开的时机。为了程序的可移植性,这两种情况都需要加以考虑,如“
Java应用程序的Info.plist文件”部分所示。
”
--原文引自:http://blog.csdn.net/casularm/archive/2008/12/29/3636049.aspx(CSDN也有此好文啊 )。
建议JOR的开发者参考实现之。
我只能临时将JOR.SRC 的
XmlSourceTree.TreeMouserListener.mouseReleased()方法按如下代码小改造下。不过,这样左键也会弹出了。虽然上述参考可以尝试,没有这个精力了,留给我们亲爱的JOR们了!
public void mouseReleased(MouseEvent e) {
if (enablePopup) {
String os = System.getProperty("os.name");
if (e.isPopupTrigger() || "Mac OS X".equalsIgnoreCase(os)) {
int row = getRowForLocation(e.getX(), e.getY());
if (row != -1) {
setSelectionInterval(row, row);
TreePath path = getPathForRow(row);
DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
TreeNodeValue nodeValue = (TreeNodeValue) node.getUserObject();
JPopupMenu menu = TreePopupFactory.createPopup(XmlSourceTree.this,
nodeValue.getSourceType(), node);
if (menu != null) {
Rectangle b = getPathBounds(getSelectionPath());
menu.show(e.getComponent(), e.getX(), b.y + b.height);
}
}
}
}
}
[
本帖最后由 flashcloud 于 2010-11-20 15:47 编辑 ]