Java 鼠标标记未返回相应的按钮
我如何知道在Java 鼠标标记未返回相应的按钮,java,swing,awt,mouse-listeners,Java,Swing,Awt,Mouse Listeners,我如何知道在mouseDragged事件中按下的按钮 我在mouseDragged()中遇到问题,因为收到的MouseEvent为getButton()返回0。我对鼠标的位置没有问题,甚至检测到鼠标的点击。mouseClicked()事件为getButton()返回相应的按钮 有没有关于我如何做到这一点的建议?我假设我可以使用mouseClicked,或者mousePressed,但我更愿意将这一切都保留在mouseDragged中 感谢您的时间和回答。这可能是您的java沙箱的问题 以下代码一
mouseDragged
事件中按下的按钮
我在mouseDragged()
中遇到问题,因为收到的MouseEvent
为getButton()
返回0。我对鼠标的位置没有问题,甚至检测到鼠标的点击。mouseClicked()
事件为getButton()
返回相应的按钮
有没有关于我如何做到这一点的建议?我假设我可以使用mouseClicked
,或者mousePressed
,但我更愿意将这一切都保留在mouseDragged
中
感谢您的时间和回答。这可能是您的java沙箱的问题 以下代码一直运行良好(如您所见,几乎如此)
请在另一台机器上尝试您的代码。正如评论和其他答案中所指出的,SwingUtilities为此类情况提供了三种方法,适用于所有鼠标事件:
SwingUtilities.isLeftMouseButton(aMouseEvent);
SwingUtilities.isRightMouseButton(aMouseEvent);
SwingUtilities.isMiddleMouseButton(aMouseEvent);
至于您的方法的问题是什么,getButton()
的javadoc说:
返回已更改状态的鼠标按钮(如果有)
由于按下按钮时按钮的状态不会改变,getButton()
通常会在mouseDragged
中返回NO\u按钮。要在mouseDragged
中检查按钮和修改器(如Ctrl、Alt等)的状态,可以使用getModifiersEx()
。例如,下面的代码检查BUTTON1
是否已关闭,但BUTTON2
是否未关闭:
int b1 = MouseEvent.BUTTON1_DOWN_MASK;
int b2 = MouseEvent.BUTTON2_DOWN_MASK;
if ((e.getModifiersEx() & (b1 | b2)) == b1) {
// ...
}
Jacob说得对,getButton()
并没有设计好按钮。但是,我在getModifiersEx()
上找到了一个比位操作更干净的解决方案,您也可以在mouseDragged
中使用它:
if (SwingUtilities.isLeftMouseButton(theMouseEvent)) {
//do something
}
中键和右键也有类似的方法。你能用鼠标右键拖动吗?我只用鼠标左键拖动。我测试了两个按钮,两个按钮都发送了0。你说得对。我想这对于可移植性来说也比getModifiersEx()
(MacOS,Linux,…)@xav在可移植性方面完全相同(非常可移植),因为isLeftMouseButton(…)
&co.方法就是根据它来实现的。看见这些都是简单易读的方便方法。关于第一部分(javadoc),您是对的,但我认为使用SwingUtilities.isLeftMouseButton()
更好(请参见其他答案)@xav,因为这已经是公认的答案,我添加了SwingUtilities方法以提高可见性(并详细介绍了为什么可以选择getModifiersEx
)。
int currentMouseButton = -1;
@Override
public void mousePressed(MouseEvent e) {
currentMouseButton = e.getButton();
}
@Override
public void mouseReleased(MouseEvent e) {
currentMouseButton = -1;
}
@Override
public void mouseDragged(MouseEvent e) {
if (currentMouseButton == 3) {
System.out.println("right button");
}
}
if (SwingUtilities.isLeftMouseButton(theMouseEvent)) {
//do something
}