有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java同时按下两个鼠标按钮无法正常工作

我必须检查我是否按下了鼠标左键、右键或两个按钮,下面是一个示例代码:

package sandbox;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Sandbox extends JFrame {

    public static void main(String[] args) {
    Sandbox s = new Sandbox();
    s.setVisible(true);

    }

    public Sandbox() {
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(300, 200);
    setResizable(false);
    setTitle("Frame");
    setLayout(null);
    JButton but = new JButton("click me");
    but.setBounds(0, 0, 120, 50);
    but.addMouseListener(new MouseListener() {

        @Override
        public void mouseClicked(MouseEvent e) {
        }

        @Override
        public void mousePressed(MouseEvent e) {
        if(SwingUtilities.isLeftMouseButton(e) | SwingUtilities.isRightMouseButton(e))
            System.out.println("both");
        else if(SwingUtilities.isLeftMouseButton(e))
            System.out.println("left");
        else if(SwingUtilities.isRightMouseButton(e))
            System.out.println("right");
        }

        @Override
        public void mouseReleased(MouseEvent e) {
        }

        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }
    });
    add(but);
    }

}

我必须使用SwingUtilities,但如果我按下左或右单键,它将打印“两者”,而不是“左”或“右”,如果我使用MouseeEvent类,它工作正常,但如果可能,我需要使用SwingUtilities类,谢谢

编辑:使用MouseeEvent类它工作正常:

if(e.getModifiersEx() == (MouseEvent.BUTTON1_DOWN_MASK | MouseEvent.BUTTON3_DOWN_MASK))
...

共 (2) 个答案

  1. # 1 楼答案

    不要检查using OR(|),而是使用AND(&或更好的快捷版本&&):

    if(SwingUtilities.isLeftMouseButton(e) && SwingUtilities.isRightMouseButton(e))
      ...
    

    更新

    为了检查两个按钮是否都按下,SwingUtilities似乎不是正确的工具。isXxxxMouseButton(...)方法的作用与您的相同,它们检查按钮掩码,但使用不同的掩码,当两个按钮都按下时,似乎无法设置这些掩码

    例如,isRightMouseButton()实现如下:

    public static boolean isRightMouseButton(MouseEvent anEvent) {
        return ((anEvent.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK);
    }
    

    正如您所见,实现并没有那么复杂,所以您最好自己进行掩码检查

  2. # 2 楼答案

    按钮上的鼠标列表事件

    but.addMouseListener(new MouseListener() {
    

    鼠标监听事件的名声

    this.addMouseListener(new MouseListener() {
    

    请与'||' not '|'联系,不要使用&&;因为不可能同时按下两个按钮

    if(SwingUtilities.isLeftMouseButton(e) || SwingUtilities.isRightMouseButton(e))
    

    你会得到结果的

    both
    left
    both
    left
    both
    right