KeyListener не работает при экспорте в виде исполняемого файла jar [duplicate]

Для HTML5 html5 lib был оставлен уже много лет. Единственная библиотека HTML5, которую я могу найти с недавними записями обновления и обслуживания, - это html5-php , который чуть больше недели назад был добавлен в бета 1.0.

6
задан CorlinP 14 December 2015 в 07:58
поделиться

3 ответа

Если вы ищете эту проблему, вы увидите, что ее спрашивают и ее решают много раз.

  • KeyListeners должны быть на сфокусированном компоненте для работы. Одно из решений заключается в том, чтобы дать вашему компоненту фокус после того, как он сделал его фокусируемым.
  • Лучше использовать длинный снимок - использовать привязки клавиш. Google.

Пожалуйста, посмотрите на мой ответ на этот вопрос для получения дополнительной информации об этом, включая многие детали gory.

9
ответ дан 2 revs 23 August 2018 в 19:34
поделиться

Для справки я создаю пример, используя ваш подход; в то время как он работает, он также предлагает проблему фокуса в другом месте вашего кода. Привязки клавиш избегают этого, как показано здесь здесь .

Приложение: Вот ссылка на мое рабочее ключевое слово.

private static class TestPanel extends JPanel {

    private static final String LEFT = "Left";
    private Action left = new AbstractAction(LEFT) {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println(LEFT);
        }
    };
    private static final String RIGHT = "Right";
    private Action right = new AbstractAction(RIGHT) {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println(RIGHT);
        }
    };

    public TestPanel() {
        this.getInputMap().put(
            KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), LEFT);
        this.getActionMap().put(LEFT, left);
        this.getInputMap().put(
            KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), RIGHT);
        this.getActionMap().put(RIGHT, right);
    }
}

Оригинал SSCCE :

import java.awt.EventQueue;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * @see https://stackoverflow.com/a/16531380/230513
 */
public class Test {

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new TestPanel());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private static class TestPanel extends JPanel implements KeyListener {

        public TestPanel() {

            this.addKeyListener(this);
            this.setFocusable(true);
            this.requestFocusInWindow();
        }

        @Override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                System.out.println("Right");
            }

            if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                System.out.println("Left");
            }
        }

        @Override
        public void keyTyped(KeyEvent e) {
        }

        @Override
        public void keyReleased(KeyEvent e) {
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test().display();
            }
        });
    }
}
4
ответ дан Community 23 August 2018 в 19:34
поделиться

Мне пришлось сделать две вещи: я добавил comp.setFocusable (true); к компоненту comp, который прослушивает ключевые события, и я добавил comp.requestFocus (); к каждому действию, из-за которого comp потерял фокус.

1
ответ дан Donald Smith 23 August 2018 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: