gpt4 book ai didi

java - 全屏窗口不会使用 KeyListener 或 KeyBoardFocusManager 获取键盘输入

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:18:30 25 4
gpt4 key购买 nike

我在让我的 KeyBoardFocusManger 与我的全屏 Window 一起工作时遇到问题。无论如何,它只是不会获得键盘输入。我使用 System.exit(0)println() 来查找对 keypressed/released/typed 方法的任何调用,但没有抛出任何错误。我试过 KeyListeners;但在我读完this之后,我换成了 KeyboardFocusManager,同样的事情仍然发生。我真的很绝望;据我判断,Window 没有获得键盘的焦点?

这是我的主要内容:

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
// Determine if full-screen mode is supported directly
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
if (gs.isFullScreenSupported()) {
Frame frame = new Frame(gs.getDefaultConfiguration());
SpaceInvaderUI spaceInvaderUI = new SpaceInvaderUI(frame);
// Enter full-screen mode
gs.setFullScreenWindow(spaceInvaderUI);
} else {
JOptionPane.showMessageDialog(null, "Does not support full screen!", "Error 0x01", JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
}
});
}

这是包含 KeyBoardFocusManger 的 UI,并添加到 addListeners() 方法中:

class SpaceInvaderUI extends Window {

private JPanel drawingPanel;
private Image background;
private JButton btnExit;

public SpaceInvaderUI(Frame frame) {
super(frame);
try {
background = ImageIO.read(getClass().getResourceAsStream("background.png"));
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Could not extract resource: " + ex.getMessage(), "Error 0x02", JOptionPane.ERROR_MESSAGE);
System.exit(2);
}
createWindow();
}

private void createComponents() throws HeadlessException {
drawingPanel = new DrawingPanel(background, this);
btnExit = new JButton("Exit");
}

private void createWindow() {
createComponents();
addListeners();
addComponentsToWindow();
}

private void addComponentsToWindow() {
add(drawingPanel, BorderLayout.CENTER);
add(btnExit, BorderLayout.SOUTH);
}

private void addListeners() {
KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
manager.addKeyEventDispatcher(new MyDispatcher());
btnExit.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
});
}

private class MyDispatcher implements KeyEventDispatcher {

@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED) {
System.out.println("pressed");
System.exit(0);
} else if (e.getID() == KeyEvent.KEY_RELEASED) {
System.out.println("released");
System.exit(0);
} else if (e.getID() == KeyEvent.KEY_TYPED) {
System.out.println("Typed");
System.exit(0);
}
return false;
}
}
}

退出按钮只是因为我厌倦了通过任务管理器终止我的应用程序。最后这是我的面板,游戏将在其上进行,我的背景被绘制在上面:

public class DrawingPanel extends JPanel {

private final Image background;
private final SpaceInvaderUI invaderUI;

DrawingPanel(Image background, SpaceInvaderUI invaderUI) {
this.background = background;
this.invaderUI = invaderUI;
}

@Override
protected void paintComponent(Graphics grphcs) {
super.paintComponent(grphcs);
grphcs.drawImage(background.getScaledInstance((int) invaderUI.getWidth(), (int) invaderUI.getHeight(), Image.SCALE_SMOOTH), 0, 0, this);
}
}

提前谢谢你。

编辑:我现在已经尝试在我的 drawingPanel 上使用键绑定(bind),但是当我按下 f2 时仍然没有任何反应:

class SpaceInvaderUI extends Window {

private JPanel drawingPanel;
private Image background;
private JButton btnExit;

public SpaceInvaderUI(Frame frame) {
super(frame);
try {
background = ImageIO.read(getClass().getResourceAsStream("background.png"));
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Could not extract resource: " + ex.getMessage(), "Error 0x02", JOptionPane.ERROR_MESSAGE);
System.exit(2);
}
createWindow();
}

private void createComponents() throws HeadlessException {
drawingPanel = new DrawingPanel(background, this);
btnExit = new JButton("Exit");
}

private void createWindow() {
createComponents();
addListeners();
addComponentsToWindow();
}

private void addComponentsToWindow() {
add(drawingPanel, BorderLayout.CENTER);
add(btnExit, BorderLayout.SOUTH);
}

private void addListeners() {
Action exit = new AbstractAction() {

public void actionPerformed(ActionEvent e) {
System.exit(0);
}
};
drawingPanel.getInputMap().put(KeyStroke.getKeyStroke("F2"),
exit);
btnExit.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
});
}
}

最佳答案

为什么要在 Swing GUI 中使用 AWT 组件?我担心(但不确定)这样做,您可能会失去一些 Swing 功能。

如果您只是捕捉选择键的选择键来控制游戏,请考虑使用 Key Bindings .

编辑:
不,AWT 组件没有问题,但可能仍然不应使用。

编辑 2:
由于某种原因,您的顶级窗口没有聚焦。继续测试代码...

编辑 3:
使用 JFrame 对我有用:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test3 {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
if (gs.isFullScreenSupported()) {
SpaceInvaderUI spaceInvaderUI = new SpaceInvaderUI(gs.getDefaultConfiguration());
gs.setFullScreenWindow(spaceInvaderUI);
} else {
JOptionPane.showMessageDialog(null,
"Does not support full screen!", "Error 0x01",
JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
}
});
}
}

// class SpaceInvaderUI extends JWindow {
class SpaceInvaderUI extends JFrame {

private JPanel drawingPanel;
private Image background;
private JButton btnExit;

public SpaceInvaderUI(GraphicsConfiguration gc) {
super(gc);
createWindow();
addKeyBindings();
setUndecorated(true);
}

private void addKeyBindings() {
int condition = JPanel.WHEN_IN_FOCUSED_WINDOW;
InputMap inputMap = drawingPanel.getInputMap(condition );
ActionMap actionMap = drawingPanel.getActionMap();

boolean released = false;
KeyStroke upArrowKeyStrokePressed = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, released );
String upArrowPressed = "up arrow pressed";
inputMap.put(upArrowKeyStrokePressed , upArrowPressed);
actionMap.put(upArrowPressed, new AbstractAction() {

@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("up arrow pressed");
}
});

released = true;
String upArrowReleased = "up arrow released";
KeyStroke upArrowKeyStrokeReleased = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, released );
inputMap.put(upArrowKeyStrokeReleased , upArrowReleased);
actionMap.put(upArrowReleased , new AbstractAction() {

@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("up arrow released");
}
});

}

private void createComponents() throws HeadlessException {
drawingPanel = new DrawingPanel(background, this);
btnExit = new JButton("Exit");
}

private void createWindow() {
createComponents();
addListeners();
addComponentsToWindow();
}

private void addComponentsToWindow() {
add(drawingPanel, BorderLayout.CENTER);
add(btnExit, BorderLayout.SOUTH);
}

private void addListeners() {
// KeyboardFocusManager manager = KeyboardFocusManager
// .getCurrentKeyboardFocusManager();
// manager.addKeyEventDispatcher(new MyDispatcher());
btnExit.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
});
}
//
// private class MyDispatcher implements KeyEventDispatcher {
//
// @Override
// public boolean dispatchKeyEvent(KeyEvent e) {
// System.out.println("in dispatch. KeyEvent := " + e);
// if (e.getID() == KeyEvent.KEY_PRESSED) {
// System.out.println("pressed");
// System.exit(0);
// } else if (e.getID() == KeyEvent.KEY_RELEASED) {
// System.out.println("released");
// System.exit(0);
// } else if (e.getID() == KeyEvent.KEY_TYPED) {
// System.out.println("Typed");
// System.exit(0);
// }
// return false;
// }
// }
}

class DrawingPanel extends JPanel {

private final Image background;
private final SpaceInvaderUI invaderUI;

DrawingPanel(Image background, SpaceInvaderUI invaderUI) {
this.background = background;
this.invaderUI = invaderUI;
setBackground(Color.pink);
}

@Override
protected void paintComponent(Graphics grphcs) {
super.paintComponent(grphcs);
}
}

关于java - 全屏窗口不会使用 KeyListener 或 KeyBoardFocusManager 获取键盘输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11178908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com