Java Swing如何同时按住鼠标的左右键

7

我希望实现一种方法,用户需要同时按住左右鼠标按钮。

我正在使用Swing和Java 1.7。我尝试过以下代码,但它不能像我期望的那样检测到同时按下两个按钮的情况:

public void mousePressed(MouseEvent e) {    
     if (SwingUtilities.isLeftMouseButton(e) && SwingUtilities.isRightMouseButton(e)){
              ///code here
     }
}

我尝试分离方法并使用布尔值来确定鼠标按钮是否被按下,然后设置一个条件来判断它们是否同时被按下,但这也没有成功。


2
“我尝试分离方法并使用布尔值来决定鼠标按钮是否被按下,然后我设置了一个条件来判断它们是否同时被按下,但这也没有成功...” - 听起来是一个合理的方法。请发布您尝试过的 SSCCE 来展示您的代码。 - camickr
非常感谢您的关注...但是下面张贴的代码是有效的,它与原来的代码几乎相同,但是鼠标按下的判断是基于if (SwingUtilities.isLeftMouseButton(e)) { left = true },而这种方式并不起作用...奇怪:D - Matej Špilár
2个回答

6
这是一个SSCCE,它可以做你想要的事情...也就是说,如果我正确理解了你的问题。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class StackOverflow15957076 extends MouseAdapter
{
    private JLabel status;

    private boolean isLeftPressed;
    private boolean isRightPressed;

    public StackOverflow15957076 ()
    {
        JFrame frame = new JFrame ();
        frame.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);

        JPanel panel = new JPanel (new FlowLayout (FlowLayout.CENTER));

        status = new JLabel ("waiting for both mouse buttons...");

        status.addMouseListener (this);

        panel.add (status);

        frame.add (panel);

        frame.pack ();
        frame.setVisible (true);

        isLeftPressed = false;
        isRightPressed = false;
    }

    @Override
    public void mousePressed (MouseEvent e)
    {
        if (SwingUtilities.isLeftMouseButton (e))
        {
            isLeftPressed = true;
        }
        else if (SwingUtilities.isRightMouseButton (e))
        {
            isRightPressed = true;
        }

        if (isLeftPressed && isRightPressed)
        {
            status.setText ("both buttons are pressed");
        }
    }

    @Override
    public void mouseReleased (MouseEvent e)
    {
        if (SwingUtilities.isLeftMouseButton (e))
        {
            isLeftPressed = false;
        }
        else if (SwingUtilities.isRightMouseButton (e))
        {
            isRightPressed = false;
        }

        status.setText ("waiting for both mouse buttons...");
    }

    public static void main (String[] args)
    {
        SwingUtilities.invokeLater (new Runnable ()
        {
            @Override
            public void run ()
            {
                new StackOverflow15957076 ();
            }
        });
    }
}

我本来想点赞的,但你使用了MouseEvent.BUTTON1/BUTTON3而不是SwingUtilities.isXXX方法(与OP使用的相同),后者更容易理解。 - camickr
@camickr SwingUtilities 中的方法是更好的抽象,但我认为它具有相同的功能... 你可以使用你认为最好的那一个 :) 。 - Radu Murzea
@Radu Murzea,您能否编辑您的问题并添加相同的代码,包括两个if(SwingUtilities.is...),以便它可以正确地工作?这是一个常见问题,所有多个键(鼠标)事件都应该单独测试。 - mKorbel
2
SwingUtilities是更好的抽象 - 这就是想法,“isLeftButton”比“BUTTON1”更容易理解。没有猜测代码意图的必要。该API充满了更高级别的抽象。我们在论坛中不断建议人们尽可能使用这些抽象。 - camickr
1
@camickr 和 mKorbel:好的,我编辑了我的回答并更改了那些条件。 - Radu Murzea
@Radu Murzea 我觉得你会杀了我,你可以发布两个分离的代码,两者都是正确的,都是优秀的答案!!! :-) - mKorbel

1
似乎直接做不到,因为鼠标事件是按顺序触发的。例如,请参见此SO问题/答案
所以您需要决定“同时”实际上对您意味着什么(即它们应该在时间上有多接近)。然后,您可以捕获两个单独的事件并比较它们的getWhen()值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接