mouseMoved事件似乎只被调用一次

时间:2017-08-30 22:25:36

标签: java jframe mousemotionlistener

尝试用头顶相机制作简单的RPG游戏。当我去实现一个 MouseMotionListener ,这不是我第一次使用 MouseMotionListener 时,似乎只有 mousedMoved MouseEvent 才能获得叫一次然后简单似乎不再起作用。我已经坚持了很长一段时间,所有的研究都让我陷入了死胡同。

我确实有一个带有刻度和渲染方法的完整游戏循环。但是正如你在下面的代码中看到的那样,在鼠标处理类中(代码的底部位)它返回一个数字,每当鼠标移动时它会增加一个(在tick方法中我向控制台打印数字的值)并且它还应该向控制台打印鼠标x和y坐标。当您运行该程序时,该数字等于1,它只打印一次鼠标坐标。一个例子是控制台输出看起来像这样:

124 82
1

或者,如果我的鼠标没有悬停在JFrame上进行程序启动时,它将如下所示:

0

这是我的游戏循环的init方法:

private void init() {
    display = new Display("Operation Blood Bath: Alpha 0_5.0", 800, 600);
    game = new Game();
    Assets.init();
}

这是我在init方法中调用的显示类:

public class Display {

private JFrame frame;
private Canvas canvas;

public Display(String title, int width, int height) {
    frame = new JFrame(title);
    frame.setSize(width, height);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

    canvas = new Canvas();
    canvas.setPreferredSize(new Dimension(width, height));
    canvas.setMaximumSize(new Dimension(width, height));
    canvas.setMinimumSize(new Dimension(width, height));
    canvas.setFocusable(false);

    frame.add(canvas);
    frame.addMouseMotionListener(new MouseMotionHandling());
    frame.pack();
}

public Canvas getCanvas() {
    return canvas;
}

public JFrame getFrame() {
    return frame;
}

}

tick方法:

private void tick() {
    game.tick();
    System.out.println(MouseMotionHandling.HELLO());
}

这是在显示类中调用的鼠标处理类:

public class MouseMotionHandling implements MouseMotionListener {

private static int number = 0;

@Override
public void mouseDragged(MouseEvent arg0) {

}

@Override
public void mouseMoved(MouseEvent arg0) {
    System.out.println(arg0.getX() + " " + arg0.getY());
    number++;
}

public static int HELLO () {
    return number;
}

}

我在哪里工作?

1 个答案:

答案 0 :(得分:1)

问题是您的canvas完全填充了JFrame的内容窗格,因此捕获了所有鼠标事件。最简单的解决方法是将鼠标监听器添加到canvas而不是frame

至于你为什么在你的框架上接收一个鼠标事件 - 我认为这必然是由于创建各种组件的时间问题。