JFrame 上的 MouseListener 只监听边框
MouseListener on JFrame only listens borders
我正在尝试创建一个 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,它应该得到这个 MouseListener。
一些旁注:
- 我尽量避免扩展 JFrame 并建议您也这样做,除非您计划覆盖它的行为(方法)。相反,在需要时创建 JFrame。
- 您的 Window class 实际上扩展了 JFrame,但甚至没有创建可显示的
this
对象,因此还有另一个(更强大的)理由不使用此 class 扩展 JFrame。
- 我建议让 Game 对象通过重写其
getPreferredSize()
方法来指定自己的大小,然后让 JFrame 通过在 JFrame after[=] 上调用 pack()
来实现这一点25=] 添加所有组件。
- 请注意,核心 Java 已经有一个 Window class,您可能希望避免让您的 class 与核心 Java 共享名称 classes,以防万一您以后希望使用其中一个核心 classes,并希望避免 运行 名称冲突。
将 MouseListener
添加到 Game
(实际上需要鼠标事件)而不是 JFrame
(不需要,并添加框架 decorations/border).
我正在尝试创建一个 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,它应该得到这个 MouseListener。
一些旁注:
- 我尽量避免扩展 JFrame 并建议您也这样做,除非您计划覆盖它的行为(方法)。相反,在需要时创建 JFrame。
- 您的 Window class 实际上扩展了 JFrame,但甚至没有创建可显示的
this
对象,因此还有另一个(更强大的)理由不使用此 class 扩展 JFrame。 - 我建议让 Game 对象通过重写其
getPreferredSize()
方法来指定自己的大小,然后让 JFrame 通过在 JFrame after[=] 上调用pack()
来实现这一点25=] 添加所有组件。 - 请注意,核心 Java 已经有一个 Window class,您可能希望避免让您的 class 与核心 Java 共享名称 classes,以防万一您以后希望使用其中一个核心 classes,并希望避免 运行 名称冲突。
将 MouseListener
添加到 Game
(实际上需要鼠标事件)而不是 JFrame
(不需要,并添加框架 decorations/border).