Обработчик клавиатуры java, как обработать нажатие клавиши в консоли?

Rams666

Добрый всем вечер! Передо мной встал такой вопрос, можно ли в обычном консольном приложении, написанном на java, обработать нажатие клавиши с клавиатуры? Например, сделать так, чтобы при нажатии кнопки "UP" или "DOWN" какая-нибудь переменная увеличивалась или уменьшалась на единицу! Это как пример?! Может кто уже сталкивался с подобным, подскажите, как это реализуется?

5 ответов

Rams666

Средствами Java реализовать консольный отлов нажатия функциональных клавиш невозможно. Отловить удастся только клавиши, добавляющие в консоль некоторый символ.

Варианты решения:

  1. Написать свое AWT/Swing или даже SWT - приложение, имитирующее консоль, но вместо нее содержащее текстовое поле, к которому уже навесить нужные слушатели.

  2. Выбрать клавишу (или сочетание клавиш), вводящую в консоль некоторый символ (например, "+" и "-" для переключения переменной). И попробовать убирать этот символ из консоли, дописывать в нее желаемые результаты и т.д (в том, что удастся такое реализовать - сомневаюсь).

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


Rams666

Маловероятно, что это можно сделать средствами Java. Скорее всего придется писать нативный код под нужную платформу и цеплять его через JNI. Можно попробовать работать с curses (ncurses).


Rams666

char ch ;
    int code ;
    while ( -1 != (code = System.in.read ()) )
    {
        ch = (char) code ;
        System.out.println ( "you pressed: '" + ch + "'\n" ) ;

        // выйти когда нажато 'q'
        if ( 'q' == ch )
        {
            System.exit ( 0 ) ;
        }
    }


Rams666

http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html - вот тут, в принципе, все есть.

public class KeyEventDemo ...  implements KeyListener ... {
...
    /** Handle the key-pressed event*/
    public void keyPressed(KeyEvent e) {
        if (e == KeyEvent.VK_KP_UP ) {
            //Insert your code here
        } else if (e == KeyEvent.KEY_LOCATION_LEFT) {
            //Insert your code here
        } else if (e == KeyEvent.KEY_LOCATION_RIGHT) {
            //Insert your code here
        }
    }
...
}

На работоспособность не проверял


Rams666

public class AirBallon {
private static int x_location=350;
static JFrame finalMenu=new JFrame();
public static void start1(){
finalMenu.addKeyListener(new KeyAdapter() {

        public void keyPressed(KeyEvent evt) {

           switch (evt.getKeyCode() ) {
             case KeyEvent.VK_RIGHT:
                if(x_location>700)
                 break;
                   right(x_location);

                   x_location++;
                   System.out.println(x_location);
                   break;
               case KeyEvent.VK_LEFT:
                   if(x_location<0)
                       break;
                   right(x_location) ;
                   x_location--;

                   break;
               case KeyEvent.VK_UP:

                     up();

                   break;

               default:
               System.out.println("");
           break;}

 private static void right(int k) {

            labe2.setBounds(k, 450, 100, 150);}

}

licensed under cc by-sa 3.0 with attribution.