Java 2D游戏 - MouseClicked& MouseMoved方法

时间:2016-06-13 11:06:09

标签: java multithreading swing mouseevent

问题
我有两个MouseEvent处理程序(mouseClicked和mouseMoved),它们都可以工作,但只能单独使用。

如果单击鼠标,则操作处理正常。 (子弹被解雇)
如果我移动鼠标,操作会得到很好的处理。 (精灵移动)

当我同时执行两个操作(单击时移动鼠标)时会出现问题。 mouseMoved事件很好,但是没有调用mouseClicked事件。

以下代码在我的Game类构造函数中,它正在扩展JPanel。

    this.addMouseListener(new MouseAdapter(){
        @Override
        public void mouseClicked(MouseEvent e){
            //This creates a new bullet, and adds to an array to get drawn.
            bullet = new Bullet(105, e.getY()+5, bulletTexture);
            bulletsOnScreen.add(bullet);
            e.consume();    
        }
    });



    this.addMouseMotionListener(new MouseAdapter(){
        @Override
        public void mouseMoved(MouseEvent e){
            //This increments the sprites position on the screen.
            player.setYPosition(e.getY()-50); 
            e.consume();
        };
    });

我尝试了什么

我尝试使用SwingWorker对象在后台线程中运行mouseMoved,但结果是相同的(子弹不会触发)。

        @Override
        public void mouseMoved(MouseEvent e){

            SwingWorker myWorker = new SwingWorker<Void, Void>(){

                @Override
                protected Void doInBackground() throws Exception {
                    player.setYPosition(e.getY()-50);
                    e.consume();

                    return null;
                }

            };

            myWorker.execute();
        };

我还尝试在mouseMoved方法中检查mouseClick,但再次没有成功。

        public void mouseMoved(MouseEvent e){
            if(e.getButton() == MouseEvent.MOUSE_CLICKED){
                //Create bullet and add to array (but this never gets called)
            }

            player.setYPosition(e.getY()-50); 
            e.consume();
        };

如果有人有任何想法或指示,那将非常感谢。

1 个答案:

答案 0 :(得分:2)

以下是我编写的一些代码,其中包含您所描述的行为的完整工作示例。

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Main {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                System.out.println("Pressed");
            }

            @Override
            public void mouseClicked(MouseEvent e) {
                System.exit(1);
            }
        });


        frame.addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseMoved(MouseEvent e) {
                System.out.println("Moved");
            }
        });

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(100, 100);
                frame.setVisible(true);
            }
        });

    }
}

正如您在框架中移动时所看到的那样,您将获得大量"Moved"个事件 对你来说最有趣的是,当你按下鼠标键时,你会看到"Pressed"。如果您在没有移动的情况下发布,则会有点击事件(应用程序将退出)。关闭应用程序可能有点极端,但我们必须确保我们不会错过该事件。
但是当您按下鼠标按钮,按住它并移动时,您将看不到任何触发的移动事件。然后,当你发布时,你也不会被点击事件。

我不确定此部分,但只有当mouseClicked mousePressed事件一个接一个地发生时,才会触发mouseReleased。< / p>

在你的游戏中,当你基本上同时点击并移动鼠标时

  

mousePressed - &gt; mouseMoved - &gt;的mouseReleased

但结果不会触发mouseClicked

我的建议是,您处理mousePressed而不是mouseClicked,或尝试根据您的需要调整MouseAdapter#mouseDragged方法。