java - JFrame 上的 MouseListener 只监听边框

标签 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) {}
}

最佳答案

我认为您最不想做的就是将 MouseListener 添加到 JFrame,因为 JFrame 不应该承担此责任。它的责任应该是保存和显示添加到它的组件,它可能是这些组件之一,可能是显示游戏 Activity View 的组件,很可能是 JPanel,它应该获取此 MouseListener。

一些旁注:

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

关于java - JFrame 上的 MouseListener 只监听边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32417425/

相关文章:

java - 如何在运行时更新 Java 应用程序的库?

java - 从 JDialog 按钮刷新 JFrame 并刷新表

java - 类型转换错误

java - 如何消除大型项目中的依赖关系?

Java:雅虎通讯录API

java - 在 Swing JPanel 的布局属性中获取 X 和 Y 而不是水平/垂直尺寸

java - 如何远程切换 JPanel?

java - 如何使用时钟获取 LocalDateTime 从纪元开始的毫秒数?

java - 绘图时 JFrame 边框弄乱坐标

java - 从 main 实现和调用 JFrame/ActionListener 类