KeyListener не срабатывает после того, как я поменяю JPanels - PullRequest
0 голосов
/ 21 февраля 2011

Я создаю игру, и у меня это так, что, когда пользователь нажимает «I» в игре, игровая панель становится невидимой, в то время как она добавляет панель инвентаризации в JFrame. Затем, когда пользователь выходит из инвентаря, он удалит JPanel инвентаризации, а затем вернет игровую JPanel на видимость.

Теперь все это звучит хорошо, но всякий раз, когда он удаляет Inventory JPanel и возвращается в игру JPanel, KeyListener перестает работать. Я даже вернул обратно свойство setFocusable (true) в игре JPanel после того, как удаляю Inventory JPanel, но он все еще не заставляет KeyListener работать.

Вот мой код для игры Jpanel:

package javavideogame;

public class Game extends JPanel implements ActionListener, Runnable
{

    public Game(MainCharacter character)
    {
        TAdapter a = new TAdapter();
        addKeyListener(a);
        setFocusable(true);
        setDoubleBuffered(true);
        setFocusTraversalKeysEnabled(false);
    }

    public void getInventoryScreen()
    {
        Main.inv = new Inventory();
        Main.inv.sayHello();
        Main.mainGame.getContentPane().add(Main.inv);
        Main.game.setVisible(false);
        Main.mainGame.validate();
    }

    public void closeInventory()
    {
        Main.inv.setFocusable(false);
        Main.mainGame.remove(Main.inv);
        Main.game.setVisible(true);
        Main.game.setFocusable(true);
    }

    public class TAdapter extends KeyAdapter
    {
        public void keyPressed(KeyEvent e)
        {
            character.keyPressed(e);
        }

        public void keyReleased(KeyEvent e)
        {
            character.keyReleased(e);
        }
    }

}

А вот код инвентаря:

package javavideogame;

public class Inventory extends JPanel implements KeyListener
{
    public Inventory()
    {
        setBackground(Color.RED);
        addKeyListener(this);
        setFocusable(true);
    }

    public void keyPressed(KeyEvent e)
    {
        int key = e.getKeyCode();
        if(key == KeyEvent.VK_I)
        {
            Main.game.closeInventory();
        }
    }

    public void keyReleased(KeyEvent e)
    {

    }

    public void keyTyped(KeyEvent e)
    {

    }
}

И да, мне трудно заставить код работать правильно:)

Но есть ли что-то, что я могу легко вставить в код, чтобы KeyListener действительно работал правильно, как только вернется в игру JPanel?

Ответы [ 2 ]

5 голосов
/ 21 февраля 2011

Я даже вернул обратно свойство setFocusable (true) в игре JPanel после удаления инвентаря JPanel

Ключевые события отправляются только в компонент, имеющий фокус.Вам нужно вызвать:

panel.requestFocusInWindow();

после замены панелей, чтобы убедиться, что панель снова сфокусирована.

Однако лучше использовать привязки клавиш iteadKeyListener.

0 голосов
/ 21 февраля 2011

Вы можете пропустить работу по добавлению и удалению панелей на панели содержимого и просто установить видимость.Тогда вам также следует пропустить установку свойства focusable (KeyEvents не будет передано невидимому компоненту в любом случае), и ваши ключевые слушатели должны быть сохранены и снова вступить в силу, когда компонент станет видимым.

...