问题
我有两个MouseEvent处理程序(mouseClicked和mouseMoved),它们都可以工作,但只能单独使用。
如果单击鼠标,该 Action 将得到很好的处理。 (子弹被解雇)
如果我移动鼠标,该 Action 将得到很好的处理。 ( Sprite 移动)
当我同时执行两个操作(单击时移动鼠标)时,会出现问题。 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();
};
如果有人有任何想法或建议,将非常感谢。
最佳答案
这是我编写的一些代码,以获取您描述的行为的完整示例。
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"
。如果您不动而释放,将会有一个单击事件(应用程序将退出)。关闭应用程序可能有点极端,但是我们必须确保我们不会错过该 Activity 。但是,当您按下鼠标按钮并按住并移动时,您将不会看到触发任何移动事件。然后,释放时,您也不会触发clicked事件。
我不确定这部分内容,但看起来只有当
mouseClicked
和 mousePressed
事件一个接一个发生时,才会触发mouseReleased
。在游戏中,当您同时单击并移动鼠标时,基本上
但这不会触发
mouseClicked
。我的建议是,您处理
mousePressed
而不是mouseClicked
或尝试使MouseAdapter#mouseDragged
方法适应您的需求。