Как правильно использовать KeyListener в Java

#java #awt #keylistener

#java #awt #keylistener

Вопрос:

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

Вот код:

 import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class keylistener implements KeyListener{
    public keylistener(){
        addKeyListener(this);
    }

    public void keyPressed(KeyEvent e){
        int key = e.getKeyCode();
        keylistener output = new keylistener();
        output.print(key);
    }

    public void keyReleased(KeyEvent e){}
    public void keyTyped(KeyEvent e){}

    public void print(int key){
        System.out.println(key);
    }

    public static void main(String[] args){
    }
}
  

Программа запускается, а затем завершается сразу после.
Я никогда раньше не использовал KeyListener, и я не могу понять, как заставить программу ждать нажатия клавиши.

Комментарии:

1. Ваш основной метод пуст…. Обычно вы используете keylistener с графическим интерфейсом, хотя

Ответ №1:

KeyListener предназначен для использования в приложениях с графическим интерфейсом, а не в консольных приложениях, поскольку для запуска KeyListener требуются компоненты GUI. Обычно в консольном приложении вы должны использовать BufferedReader и InputStreamReader.

Вот консольное приложение, которое демонстрирует идею использования цикла while с BufferedReader и InputStreamReader, чтобы приложение работало в ожидании ввода. Хотя есть и другие способы сделать это. Я сделал это очень четко, чтобы вы могли понять концепцию.

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class StackStuff {

public static void main(String[] args) throws IOException {
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
     boolean runs = true ;
     System.out.println("Press any key to kill this app...");
     while(runs){
          input =br.readLine();
         if (!(input==null)){
             System.out.println(input);
             runs=false;
          }
         }
     System.out.println("I am dead!!");
     System.exit(0); 

}
  

Ответ №2:

Я не думаю, что я когда-либо добавлял KeyListener в консольное приложение (вероятно, потому KeyListener , что это часть пакета AWT, который в основном содержит компоненты GUI), но вот пример приложения с графическим интерфейсом для демонстрации.

Однако ваша первая проблема заключается в том, что вы должны были добавить new keylistener() в свой main метод, хотя это должно быть добавлено к самому компоненту для запуска.

 public class GuiMain extends JFrame { // A GUI Frame

    public GuiMain() {
        // Add the listener
        this.addKeyListener(new KeyAdapter() { 
            @Override
            public void keyPressed(KeyEvent e) {
                super.keyPressed(e);
                // Print out the code
                System.out.println(e.getKeyCode());
            }
        });

        // Show something
        add(new JLabel("Hello World!"));
        pack();
    }

    public static void main(String[] args) {
        // Run the GUI
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                GuiMain gui = new GuiMain();
                gui.setVisible(true);
            }
        });
    }

}