Java - проблема JPanel и KeyListener - PullRequest
0 голосов
/ 04 октября 2010

У меня есть JFrame с 3 панелями. Я расширяю класс приложения, а затем добавляю к нему три панели, например:

JPanel controlButtonsPanel = new GameControlButtons();
        controlButtonsPanel.setPreferredSize(new Dimension(801,60));
        controlButtonsPanel.setBorder(new LineBorder(Color.white, 1));
        constraints.anchor = GridBagConstraints.NORTHWEST;
        constraints.weightx = 2;
        constraints.weighty = 0.3;
        this.add(controlButtonsPanel, constraints);

        JPanel tempP = new JPanel();     
/`/ *** I'm going to create a Jpanel subclass for this, too, I just haven't yet.`
        tempP.setPreferredSize(new Dimension(500,838));
        tempP.setBorder(new LineBorder(Color.white, 2));
        constraints.anchor = GridBagConstraints.NORTHEAST;
        constraints.weightx = 1;
        constraints.weighty = 2;
        this.add(tempP, constraints);

        JPanel graphicsPanel = new RoofRunnerGame("Ken");
        constraints.anchor = GridBagConstraints.SOUTHWEST;
        constraints.weightx = 2;
        constraints.weighty = 1;
        graphicsPanel.setBorder(new LineBorder(Color.white, 1));
        graphicsPanel.setPreferredSize(new Dimension(800,800));
        graphicsPanel.requestFocus();
        this.add(graphicsPanel, constraints);       

Я расширил JPanel для классов GameControlButtons и RoofRunnerGame. Я добавил мышеловат к первому. И я добавил слушателя мыши и ключевого слушателя к последнему.

** Проблема: слушатели мыши работают нормально для обоих, но ключевой слушатель, кажется, не слушает в моей панели RoofRunnerGame. **

В сети я нашел два возможных исправления, но сначала хотел спросить.

1) Один из них вызывал requestFocus () в подклассе RoofRunnerGame. Проблема в том, что когда я нажимаю на другую панель, она теряет фокус. (Это краткосрочное исправление.)

2) Другая вещь, о которой упоминалось, заключалась в использовании привязок клавиш. Я никогда не использовал их раньше. Я сделаю это, если вы порекомендуете это, но предпочли бы продолжать использовать keyListener, если это возможно.

Итак, что вы думаете? Есть ли способ сохранить панель RoofRunnerGame для прослушивания KEY повсюду?

1 Ответ

1 голос
/ 04 октября 2010

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

См. this и this примеры добавления ключевого прослушивателя через ActionMap. Флаг JComponent.WHEN_IN_FOCUSED_WINDOW в методе getInputMap() должен позволять вашей панели получать входные события, даже если она не сфокусирована.

...