Java KeyBindings не реагирует на JPanel - PullRequest
0 голосов
/ 07 мая 2019

Ранее я использовал Java KeyListener, но поскольку мои программы требуют больше, я получил рекомендацию переключиться на KeyBinds.

Прежде всего я попытался добавить привязки клавиш в JFrame, которые не работали(Я не понимаю, какой JComponent мне нужно использовать.)Поэтому я попытался переместить программу в JPanel и затем добавить ее в JFrame, однако привязка клавиш не реагирует, когда нажата нужная кнопка (в данном случае это кнопка «1»);

InПри вызове метода я установил для действия Print «Привет».Вот код:

public class Panel extends javax.swing.JPanel {
JPanel Panel = new JPanel();
/**
 * Creates new form Panel
 */
public Panel() {
      addKeyBinding(Panel, KeyEvent.VK_1, "1Button", (evt)->{
          System.out.println("Hi");
    });
    initComponents();
}

..... А вот и метод .....

public static void addKeyBinding(JComponent comp, int keyCode, String id, ActionListener actionListener){

    InputMap im = comp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    ActionMap ap = comp.getActionMap();

    im.put(KeyStroke.getKeyStroke(keyCode, 0, false),
        id);

        ap.put(id, new AbstractAction(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    actionListener.actionPerformed(e);
                }

    });

}

Что я делаю не так?Спасибо!

1 Ответ

3 голосов
/ 07 мая 2019

Привязки клавиш для вашей панели формы, верно?Я думаю, что вы неправильно понимаете некоторые понятия о классах и объектах.Также трудно помочь, не видя полный код.Но ваша ошибка, скорее всего, вызвана этой строкой:

addKeyBinding(Panel, KeyEvent.VK_1, "1Button", ...

, которая должна быть:

addKeyBinding(this, KeyEvent.VK_1, "1Button", ...

Переменная Panel должна быть заменена ключевым словом this, таким образом ссылаясь нафактическая панель формы.

Она также должна создаваться везде, где вы создаете окно, поэтому эту строку также можно удалить:

JPanel Panel = new JPanel();

В вашем коде много ошибок.Я не могу представить код в первом фрагменте даже компиляции.Вы пытаетесь назвать переменную так же, как ваше имя класса.

У вашего класса нет причин расширять JPanel, поскольку он не является новым типом JPanel.Просто удалите свои удлинители.Затем измените первую строку на:

JPanel panel = new JPanel();

Затем передайте строчную панель методу addKeyBinding.

Если по какой-то странной причине вы хотите сохранить расширение класса JPanel, тогда передайтеthis в качестве первого параметра для addKeyBinding, как сказал / u / tiiv, и удалите строку JPanel Panel = new JPanel, так как в этом нет необходимости (как вы уже написали, ваш класс равен JPanel).

Насколько используемый компонент JFrame является контейнером верхнего уровня, так что обычно это главное окно вашего приложения.А затем вы помещаете JPanel и другие компоненты в JFrame.На самом деле в Swing есть 4 контейнера верхнего уровня (JFrame, JWindow, JDialog и JApplet), но, как правило, именно JFrame будет использоваться в качестве основного окна приложения.

Надеюсь, это поможет.

...