【问题标题】:Pressing both mouse buttons not working correctly按两个鼠标按钮无法正常工作
【发布时间】:2014-04-24 08:39:51
【问题描述】:

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

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 来制作它,但是如果我按下左或右单个按钮,它会打印“both”,而不是“left”或“right”,如果我使用 MouseEvent 类它可以正常工作但会出现问题如果可能的话,我需要 SwingUtilities 类,谢谢。

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

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

【问题讨论】:

    标签: java swing


    【解决方案1】:

    不要使用 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);
    }
    

    如您所见,实现并不复杂,因此您最好自己进行掩码检查。

    【讨论】:

    • 它不起作用,在这种情况下“不可能”同时按下两个按钮
    • @CharlieHarper 好吧,看来SwingUtilities 不是适合这项工作的工具。 IIRC 你必须检查BUTTON1_DOWN_MASK | BUTTON3_DOWN_MASK 的事件,但SwingUtilities 使用BUTTON1_MASKBUTTON3_MASK,根据JavaDoc 不推荐使用。
    【解决方案2】:

    按钮上的鼠标监听事件

    but.addMouseListener(new MouseListener() {
    

    成名的鼠标监听事件。

    this.addMouseListener(new MouseListener() {
    

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

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

    你会得到结果

    both
    left
    both
    left
    both
    right
    

    【讨论】:

    • 你试过代码了吗?因为它不起作用,同样的问题,我认为如果我将 MouseListener 添加到按钮或 Frame 是无关紧要的。
    • @Charlie Harper 是的,与你的代码相同,只是将.addMouseListener 加到 this.addMouseListener 中,它可以工作
    • 伙计,它对我不起作用,我不敢相信它对你有用,我的代码:pastebin.com/j1GmhbAx //仍然无法相信如果我将鼠标侦听器添加到按钮或添加到按钮会有什么不同框架我认为这并不重要.. 对我来说它的工作原理是一样的。
    • 如果您需要在按钮上的鼠标事件然后将其添加到按钮上,如果您需要在框架上的鼠标事件然后将其添加到框架上,它应该在您身边工作,可能在您身边有其他问题跨度>
    • 如果你在按钮上添加它然后点击左侧按钮,你在哪里点击,如果你在框架上添加它然后点击框架
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 2017-03-15
    相关资源
    最近更新 更多