【发布时间】:2020-12-01 10:26:00
【问题描述】:
所以,我的窗口检测到鼠标按下而不是按键。
这里有一些缩短的代码:
public class Frame {
public static final int MAX_WIDTH = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
public static final int MAX_HEIGHT = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
private static final JWindow window = new JWindow();
private static final DrawMain dm = new DrawMain();
private static final GIH gih = new GIH();
public static void init() {
window.setSize(CVar.clientSizeX, CVar.clientSizeY);
window.setLocationRelativeTo(null);
window.setAutoRequestFocus(true);
window.add(dm);
window.addMouseListener(mh);
window.addMouseWheelListener(mh);
window.addMouseMotionListener(mh);
window.setVisible(true);
}
public static void update() {
window.remove(dm);
window.removeMouseListener(mh);
window.removeMouseMotionListener(mh);
window.removeMouseWheelListener(mh);
window.setSize(MAX_WIDTH, MAX_HEIGHT);
window.setLocationRelativeTo(null);
window.add(dm);
window.setAutoRequestFocus(true);
window.setAlwaysOnTop(true);
window.addMouseListener(gih);
window.addMouseWheelListener(gih);
window.addMouseMotionListener(gih);
window.addKeyListener(gih);
window.setVisible(true);
}
}
public class GIH implements KeyListener, MouseListener, MouseMotionListener, MouseWheelListener {
@Override
public void keyReleased(KeyEvent e) {
System.out.println(e.getKeyChar());
}
@Override
public void mouseClicked(MouseEvent e) {
switch (e.getButton()) {
case MouseEvent.BUTTON1 -> {
System.out.println("Mouse 1 clicked");
}
case MouseEvent.BUTTON3 -> {
System.out.println("Mouse 3 clicked");
}
}
}
无论出于何种原因,如果我单击,我会收到我的鼠标 1 单击消息,但如果我按下一个键,则既不是按键字符,也不是游戏通常在按键时给出的输出。相反,我将相应的字符写入 IntelliJ(我的 IDE)。我尝试了 window 和 dm.requestFocus() 和 window.setAutoRequestFocus(true) 的多种变体,但它们都不起作用。有谁知道为什么? (注意:dm 只是一个带有paintComponent 方法的类)
【问题讨论】:
-
您有什么理由不使用JFrame 和setUndecordated(true)?
-
部分地,我试过了,我得到了很多通过用窗口替换它来修复的错误。老实说,我不知道为什么它修复了这些错误,但以这种方式修复它们比单独修复每个错误更容易。
-
组件必须具有焦点才能接收 KeyEvent。 1)不要使用 JWindow(如 Gennadii 建议的那样),而是使用上面建议的 JFrame。 2) 不要使用 KeyListener。而是使用
Key Bindings。即使组件没有关注您的活动框架,它也允许您处理 KeyStroke 并调用 Action。阅读 How to Use Key Bindings 上的 Swing 教程中的部分以获取更多信息。另请查看:Motion Using the Keyboard -
感谢您的建议。我现在已经为游戏编程了 5 年(因为我 12 岁),因此当时对编程几乎一无所知。因为代码是废话,所以我和平地修改了它,我得到了这个鼠标,是的,但没有按键故障,因为我几天前修改了 GameInputHandler 类。通过将 Window 更改为 JFrame 解决了错误,并且我没有出现随机错误。我敢打赌他们在那里是因为代码首先是一团糟。 ^^
标签: java awt keylistener mouselistener jwindow