Как использовать keyTyped в Java?

Раньше я использовал класс сканера ниже для прослушивания ввода от пользователя через приглашение cmd, но я пытаюсь заставить приложение Java прослушивать текст, вместо этого используя метод keyTyped.

public static void main(String[] args) throws IOException {
    new AsteroidsGame();
    InputStream inputstream = new InputStream() {

        @Override
        public int read() throws IOException {
            return 0;
        }
    };
    try {
        FileOutputStream output = new FileOutputStream("HighScore.txt",true);
        Scanner input = new Scanner(System.in);
        PrintStream printStream = new PrintStream(output);
        printStream.println(input.next() + " " + points);
        printStream.close();
        System.out.println("Success!");
    }
    catch(IOException e){
        System.out.println(e);
    }
 }

Я не знаю, что делать с методом, который заставит его слушать нажатия клавиш и объединять буквы в одно слово. (Это способ получить имя человека для игры)

@Override

public void keyTyped(KeyEvent e) {      
if(lives == 0)
    {
        e.getKeyCode() = KeyEvent.???
    }
}

Любые предложения будут оценены, потому что библиотека Java и остальная часть Интернета очень мало могут предложить с точки зрения примеров или помощи.


person Thereisnospoon    schedule 11.08.2017    source источник
comment
Ключевые прослушиватели/события предназначены для графических интерфейсов Swing, а не для консоли. Какое полное имя KeyEvent?   -  person user1803551    schedule 11.08.2017
comment
Мне жаль, что я не ясно дал понять. Это свинг GUI. Это игра под названием астероиды, и это моя попытка узнать имя пользователей после того, как они закончат играть. Что касается имени, это моя проблема, я не знаю, что мне нужно вставить в эту строку, чтобы кто-то мог ввести свое имя.   -  person Thereisnospoon    schedule 11.08.2017
comment
Если это графический интерфейс Swing, вы не показываете использование какого-либо компонента. На чем вы рисуете игровые объекты? Какой компонент должен получить имя? Почему бы не использовать обычное текстовое поле? Будьте осторожны с ключевым слушателем, они могут вызвать проблемы с фокусировкой, см. stackoverflow.com/questions/22741215/.   -  person user1803551    schedule 12.08.2017
comment
Посмотрите на последний пост внизу этой страницы   -  person Thereisnospoon    schedule 12.08.2017
comment
Это не форум, ответы не имеют порядка (я могу упорядочить их голосованием), поэтому самые новые не всегда находятся внизу. Любая дополнительная информация входит в ваш вопрос, редактируя его, а не публикуя ответ (который будет удален, поскольку это не отвечать).   -  person user1803551    schedule 12.08.2017
comment
ой мой плохой. Я не знал.   -  person Thereisnospoon    schedule 12.08.2017


Ответы (3)


Когда нажата текстовая клавиша, которая может быть преобразована в действительный символ Unicode, она генерирует событие keyTyped. Мы можем поймать его. Клавиши вверх, вниз и т. д. могут обрабатываться типами событий e.getKeyCode().

public class SimpleKeyListener implements KeyListener {

    StringBuilder sb = new StringBuilder();

    @Override
    public void keyTyped(KeyEvent e) {
        sb.append(e.getKeyChar());
        System.out.println(sb.toString());
    }

    @Override
    public void keyPressed(KeyEvent e) {
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_UP) {
            System.out.println("UP");
        } else if(e.getKeyCode() == KeyEvent.VK_DOWN) {
            System.out.println("DOWN");
        }
    }
}

Вот привет мир, чтобы проверить это:

public class HelloWorldSwing {
    private static void createAndShowGUI() {
        JFrame frame = new JFrame("Frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.addKeyListener(new SimpleKeyListener());

        JLabel label = new JLabel("Hello Swing");
        frame.getContentPane().add(label);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
person Kaspars Rinkevics    schedule 11.08.2017
comment
Я пытаюсь сделать то, что вы сделали. Я дам вам знать, как это происходит. - person Thereisnospoon; 11.08.2017
comment
@Thereisnospoon вы должны принять ответ, если он вам поможет - person YCF_L; 11.08.2017

Если вам нужен обычный листинер, вы можете найти его в любом учебнике по Java.

Если вам нужен собственный прослушиватель, вы можете увидеть здесь: Создайте пользовательское событие на Java

У него есть хороший пример на пользовательских листаунах

person Hasan    schedule 11.08.2017
comment
Спасибо за совет. - person Thereisnospoon; 11.08.2017

Вам нужен подкласс, который расширяет класс KeyAdapter, это дает вам доступ к методу keyPressed в классе KeyAdapter, который вы затем можете переопределить, чтобы делать то, что вам нужно в вашей программе. KeyEvent e — это параметр метода keyPressed, который имеет геттер getKeyCode, который возвращает определенное целое число в зависимости от нажатой клавиши Посмотрите простой туториал. Таким образом, ваш код будет выглядеть примерно так:

public class KL extends KeyAdapter {
    int k = 0;
    @Override
    public void keyPressed(KeyEvent e) {
        if (lives == 0) {
            k = e.getKeyCode();
        }
    }
}

Java имеет встроенные константы для keyCodes, поэтому вы можете легко использовать их по мере необходимости, например, int для левой клавиши — KeyEvent.VK_LEFT.

См. более подробное объяснение этого и объяснение KeyEvent слушателей в главе 6 превосходного бесплатного текста Экка

person Lew Perren    schedule 11.08.2017
comment
Спасибо. Я ценю вашу помощь. - person Thereisnospoon; 11.08.2017