Java 全屏窗口赢得';t使用KeyListener或KeyBoardFocusManager获取键盘输入
让我的Java 全屏窗口赢得';t使用KeyListener或KeyBoardFocusManager获取键盘输入,java,swing,fullscreen,keylistener,key-bindings,Java,Swing,Fullscreen,Keylistener,Key Bindings,让我的键盘焦点管理器使用全屏窗口时遇到问题。不管怎样,它都无法获得键盘输入。我使用了System.exit(0)和println()来查找对keypressed/released/typed方法的任何调用,但没有抛出任何错误。我尝试了keylisters;但读完之后,我换成了一个KeyboardFocusManager,同样的事情仍然发生。我真的很绝望;从我的判断来看,窗口没有获得键盘的焦点 以下是我的主要观点: public static void main(String[] args) {
键盘焦点管理器
使用全屏窗口
时遇到问题。不管怎样,它都无法获得键盘输入。我使用了System.exit(0)
和println()
来查找对keypressed/released/typed方法的任何调用,但没有抛出任何错误。我尝试了keylisters
;但读完之后,我换成了一个KeyboardFocusManager
,同样的事情仍然发生。我真的很绝望;从我的判断来看,窗口
没有获得键盘的焦点
以下是我的主要观点:
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);
}
}
});
}
下面是包含keyboardfocusmanager
的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;
}
}
}
退出按钮只是因为我厌倦了通过taskmanager关闭我的应用程序。最后,这是我的面板,游戏将在上面进行,我的背景画在上面:
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
上使用键绑定,但按f2时仍然没有任何效果:
为什么在Swing GUI中使用AWT组件?我担心(但不确定)这样做可能会失去一些Swing功能
如果你只捕获选择键选择击键来控制游戏,请考虑使用.< /P>
编辑:
不,AWT组件没有故障,但仍然可能不应使用
由于某些原因,您的顶级窗口没有聚焦。继续测试代码 编辑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);
}
}
如本文所示,您可以对按钮和键绑定使用相同的Action
实例
附录:@nIcE cOw问,我们是否可以使用InputMap
和ActionMap
在同一JComponent
上添加多个键,并使用相同的AbstractAction
类
是的,可以进行多个键绑定;我有时调用
doClick()
,以获得视听反馈,如图所示 aaaahh我真是太蠢了,我专注于在窗口中添加键绑定,这显然是不可能的,从来没有想过要将它添加到我的面板中。非常感谢:)谢谢,看来我需要使用一个框架,只需将其装饰一下,然后设置为全屏。我可以问一个关于键绑定的问题吗?我们是否可以使用InputMap
和ActionMap
在同一JComponent
上添加多个键,并使用相同的AbstractAction
类?@nIcEcOw:是的,您可以添加任意多个键,并且可以共享操作。但是,如果每个键都要执行不同的任务,在那个类中,有没有一种方法可以区分那个键被按下了?比如,如果我使用registerKeyboardAction()
,因为它现在已经过时了,在这里我可以指定一个ActionCommand
,并在同一个类中区分它,这里也有类似的东西吗?我可以问一个问题吗?这不是一个框架,而是一个窗口,我可以用一个按钮来关闭它,但我希望游戏使用“Esc”键退出并打开菜单等。我猜键绑定正是适合你的。我可以问一个关于键绑定的问题吗?我们可以使用InputMap
和ActionMap
在同一JComponent
上添加多个键,并使用相同的AbstractAction
类吗?谢谢,如果我的版本无法正常工作,这似乎是我唯一的选择
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);
}
}