Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

For some reason, my KeyListener just isn't responding to KeyPressed events.

If it matters, I'm on Ubuntu 12.04. It should be printing "Key Pressed" whenever a key is pressed, but it doesn't.

Here's the code:

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

public class DisplayPanel extends JPanel
{
    private Tile[][] tiles;
    private Creature[] creatures;
    private Dungeon dungeon;
    private Player player;

    public DisplayPanel(Dungeon dungeon, Tile[][] tiles, Creature[] creatures, Player player)
    {
        this.tiles = tiles;
        this.creatures = creatures;
        this.dungeon = dungeon;
        this.player = player;
        addKeyListener(new DungeonKeyListener());
        requestFocus();
    }

    protected void paintComponent(Graphics g)
    {
        int maximum = (getWidth() < getHeight()) ? getWidth() : getHeight();
        for (Tile[] row : tiles)
        {
            for (Tile tile : row)
            {
                if (tile != null && tile instanceof Tile)
                {
                    tile.draw(g, maximum/tiles.length, maximum/tiles[0].length);
                }
            }
        }
        for (Creature creature : creatures)
        {
            if (creature != null && creature instanceof Creature)
            {
                creature.draw(g, maximum/tiles.length, maximum/tiles[0].length);
            }
        }

        if (player != null && player instanceof Player)
        {
            player.draw(g, maximum/tiles.length, maximum/tiles[0].length);
        }
    }

    private class DungeonKeyListener extends KeyAdapter
    {
        public void keyReleased(KeyEvent e)
        {
            System.out.println("Key pressed!");
            dungeon.press(e.getKeyCode());
            repaint();
        }
    }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
313 views
Welcome To Ask or Share your Answers For Others

1 Answer

  • Call super.paintComponent (not related to you question, but will solve some issues later on)
  • Make the component "focusable" - Component#setFocusable
  • Use key bindings over KeyListener
  • Use Component#requestFocusInWindow over Component#requestFocus...

From the Java Docs

Because the focus behavior of this method is platform-dependent, developers are strongly encouraged to use requestFocusInWindow when possible


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share

548k questions

547k answers

4 comments

86.3k users

...