【问题标题】:MouseListener on JFrame only listens bordersJFrame 上的 MouseListener 只监听边框
【发布时间】:2015-09-05 20:33:06
【问题描述】:

我正在尝试创建一个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) {}
}

【问题讨论】:

  • 如果这段代码打印“in”,我会非常惊讶!

标签: java swing jframe mouselistener


【解决方案1】:

我认为您要做的最后一件事是将 MouseListener 添加到 JFrame,因为 JFrame 不应该有这个责任。它的职责应该是保存并显示添加到其中的组件,并且它可能是其中一个组件,可能是显示游戏活动视图的组件,很可能是一个 JPanel,它应该获取此 MouseListener。

一些旁注:

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

【讨论】:

    【解决方案2】:

    MouseListener 添加到Game(实际上需要鼠标事件)而不是JFrame(不需要,并增加了框架装饰/边框的复杂性)。

    【讨论】:

    • 是的,他说的。 1+
    • @HovercraftFullOfEels 是的。我们肯定在这一页上的同一页上。
    • 谢谢大家!像魅力一样工作。对不起,我是个白痴,没有考虑清楚。尽管我刚刚了解了组件,但它非常直观和简单。
    • @theman22 请考虑accept 解决您的问题的(最佳)答案,以便其他人可以看到它是解决方案。接受也会给双方一些声誉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多