JFrame上的MouseListener仅侦听边框

时间:2015-09-05 20:33:06

标签: java swing jframe mouselistener

我正在尝试创建一个JFrame,为我的游戏注册MouseEvents。但是,运行以下代码时,控制台仅在拖动框架边框时打印“in”和“out”,然后移动光标。很混乱。我尝试添加组件glassPane,然后在那里添加MouseListener,但它仍然不成功。

import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;

public class Window extends JFrame implements MouseListener {

    private static final long serialVersionUID = -240840600533728354L;

    public Window(int width, int height, String title, Game game) {
        JFrame frame = new JFrame(title);

        frame.setPreferredSize(new Dimension(width, height));
        frame.setSize(new Dimension(width, height));
        frame.setMaximumSize(new Dimension(width, height));
        frame.setMinimumSize(new Dimension(width, height));

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.add(game);
        frame.setVisible(true);
        frame.addMouseListener(this);
        game.start();
    }

    @Override
    public void mouseExited(MouseEvent e) {
        System.out.println("out");
    }

    @Override
    public void mouseClicked(MouseEvent e) {}

    @Override
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseReleased(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {}
}

2 个答案:

答案 0 :(得分:2)

我认为你要做的最后一件事是将MouseListener添加到JFrame,因为JFrame不应该承担这个责任。它的责任应该是保持并显示添加到它的组件,它可能是那些组件之一,可能是显示游戏活动视图的组件,很可能是JPanel,应该是得到这个MouseListener。

一些旁注:

  • 我尽量避免扩展JFrame,并建议您也这样做,除非您计划覆盖其行为(方法)。而是在需要时创建JFrame。
  • 你的Window类实际上扩展了JFrame,但是甚至没有创建一个可显示的this对象,所以另一个(并且更强)的理由不让这个类扩展JFrame。
  • 我建议让Game对象通过覆盖其getPreferredSize()方法指定自己的大小,然后让JFrame通过在添加所有内容后调用JFrame 上的pack()来实现此目的它的组成部分。
  • 请注意,核心Java已经有一个Window类,您可能希望避免让您的类与核心Java类共享名称,以防您希望稍后使用其中一个核心类,并希望避免遇到名称冲突。

答案 1 :(得分:2)

MouseListener添加到Game(实际上需要鼠标事件)而不是JFrame(它没有,并且添加了框架装饰的并发症/边界)。