Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JFrame上的鼠标侦听器仅侦听边框_Java_Swing_Jframe_Mouselistener - Fatal编程技术网

Java JFrame上的鼠标侦听器仅侦听边框

Java JFrame上的鼠标侦听器仅侦听边框,java,swing,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.J

我正在尝试创建一个
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不应该承担这个责任。它的职责应该是保存和显示添加到其中的组件,它可能是这些组件中的一个,可能是显示游戏活动视图的组件,很可能是一个JPanel,它应该得到这个鼠标侦听器

一些旁注:

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

我认为您最不想做的事情是将鼠标侦听器添加到JFrame,因为JFrame不应该承担此责任。它的职责应该是保存和显示添加到其中的组件,它可能是这些组件中的一个,可能是显示游戏活动视图的组件,很可能是一个JPanel,它应该得到这个鼠标侦听器

一些旁注:

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

MouseListener
添加到
游戏中(这实际上需要鼠标事件),而不是
JFrame
(这不需要,并且会增加框架装饰/边框的复杂性)

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

如果这个代码打印“in”!如果这个代码打印“in”!是的,他说的。1+@HovercraftFullOfEels是的。我们在这一点上绝对是一致的。谢谢大家!工作得很有魅力。很抱歉,我是个白痴,没把这件事想清楚。尽管我刚刚了解了组件,但它是相当直观和简单的。@ MaM22,请考虑解决问题的最佳答案,其他人可以看到它是解决方案。接受也给了双方一些声誉。是的,他说的。1+@HovercraftFullOfEels是的。我们在这一点上绝对是一致的。谢谢大家!工作得很有魅力。很抱歉,我是个白痴,没把这件事想清楚。尽管我刚刚了解了组件,但它是相当直观和简单的。@ MaM22,请考虑解决问题的最佳答案,其他人可以看到它是解决方案。接受也给了双方一些声誉。