Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检测Mac OS的右击事件_Java_Macos - Fatal编程技术网

Java 如何检测Mac OS的右击事件

Java 如何检测Mac OS的右击事件,java,macos,Java,Macos,对于windows和linux,我能够检测右键单击。但对于mac,我不知道如何检测右键点击 如何编写java程序来检测Mac OS的右键点击 谢谢 Sunil KUmar Sahoo这与在Windows或Linux上检测右键单击相同,您可以调用给定MouseeEvent的getButton()方法来检查是否单击了BUTTON3。例如,请查看以下MouseListener示例片段: public class MyListener implements MouseListener { //

对于windows和linux,我能够检测右键单击。但对于mac,我不知道如何检测右键点击

如何编写java程序来检测Mac OS的右键点击

谢谢
Sunil KUmar Sahoo

这与在Windows或Linux上检测右键单击相同,您可以调用给定MouseeEvent的
getButton()
方法来检查是否单击了
BUTTON3
。例如,请查看以下MouseListener示例片段:

public class MyListener implements MouseListener
{
    // ... code ...

    public void mouseClicked(MouseEvent event)
    {
        if (event.getButton() == MouseButton.BUTTON3)
        {
            // Right-click happened
        }
    }
}

然而,如果用户实际上有一个两个按钮的鼠标,这只会检测到右击。由于大多数MAC鼠标在不久前只有一个按钮,所以您可能需要考虑检测控制点击(这是当时右键单击的常见习惯用法)。如果您决定这样做,那么实现是非常简单的:只需添加另一个检查,检查
事件。isControlDown()
是否返回true。

而不是使用MouseEvent.BUTTON3,更好的自文档化方法是使用

if (SwingUtilities.isRightMouseButton(event))
   // do something

此外,如果您使用此代码显示弹出菜单,则不应使用此方法,因为每个操作系统都有不同的按键来输入弹出菜单。阅读Swing教程中的部分。

需要添加控件单击支持,因为Mac用户可能没有使用带有第二个按钮的鼠标-例如,轨迹板没有鼠标右键

@Override
public void mouseClicked(MouseEvent e) {
   // Mac often uses control-click - isControlDown()
   if (SwingUtilities.isRightMouseButton(e) || e.isControlDown()) {
      // do something
使用

SwingUtilities.isRightMouseButton()
将不起作用。对于Mac ctrl click示例,它的实现不正确,因为它检查
e.getModifiers()&0x4
是否为非零。但用于“命令”的标志也是
0x4

因此,它会将cmd click报告为右键单击,但不会将ctrl click报告为右键单击。更糟糕的是,cmd click还会将
true
返回到
SwingUtilities.isLeftMouseButton()
。如果您的代码以一种方式处理左键单击,而以另一种方式处理右键单击,并且您使用第二个
If
而不是
else If
,那么当这两种方法都执行时,您将面临一个严重的惊喜

对于感兴趣的人,以下是单个修改器单击的完整
getModifiers()
getModifiersEx()

Left click: (button 1)
Basic: 0000010000 0000000000    16 0
Shift: 0000010001 0001000000    17 64
Ctrl:  0000010010 0010000000    18 128
Cmd:   0000010100 0100000000    20 256
Opt:   0000011000 1000000000    24 512

Mid click: (button 2)
Basic: 0000001000 1000000000    8 512
Shift: 0000001001 0001000000    9 64
Ctrl:  0000001010 0010000000    10 128
Cmd:   0000001100 0100000000    12 256
Opt:   0000001000 1000000000    8 512

Right click: (button 3)
Basic: 0000000100 0100000000    4 256
Shift: 0000000101 0001000000    5 64
Ctrl:  0000000110 0010000000    6 128
Cmd:   0000010100 0100000000    20 256
Opt:   0000001100 1000000000    12 512

谢谢你的帮助,真的很有帮助。仅供参考,在Mac上生成真正的右键单击,用两个手指在触摸板上单击。我想你指的是MouseEvent.BUTTON3--MouseButton是另一回事。(, )
Left click: (button 1)
Basic: 0000010000 0000000000    16 0
Shift: 0000010001 0001000000    17 64
Ctrl:  0000010010 0010000000    18 128
Cmd:   0000010100 0100000000    20 256
Opt:   0000011000 1000000000    24 512

Mid click: (button 2)
Basic: 0000001000 1000000000    8 512
Shift: 0000001001 0001000000    9 64
Ctrl:  0000001010 0010000000    10 128
Cmd:   0000001100 0100000000    12 256
Opt:   0000001000 1000000000    8 512

Right click: (button 3)
Basic: 0000000100 0100000000    4 256
Shift: 0000000101 0001000000    5 64
Ctrl:  0000000110 0010000000    6 128
Cmd:   0000010100 0100000000    20 256
Opt:   0000001100 1000000000    12 512