I am having trouble getting my KeyBoardFocusManger work with my full-screen Window . Regardless, it just wonโt get keyboard input. I used System.exit(0) and println() to search for any method call with pressed / released / printed, but there were no errors. I tried KeyListeners ; but after I read this one , I changed to KeyboardFocusManager and it will happen anyway. I really feel despair; From what can I judge, Window does not focus on the keyboard?
Here is my main one:
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); } } }); }
and here is the user interface that contains KeyBoardFocusManger , and is added to the addListeners() method:
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; } } }
The exit button is only because I'm tired of killing my application using the task manager. Finally, here is my panel on which the game will be played, and my background is painted on:
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); } }
Thanks in advance.
EDIT: now I tried using the key binding on my drawingPanel , but nothing happens when I press 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); } }); } }