Событие нажатия клавиши Java не срабатывает

Во время написания этого кода я понял, что если превратить его в банку, должен быть изящный способ закрыть программу. Я решил использовать клавишу «F1». Я изучил несколько статей в Интернете и обнаружил, что способ, которым я пытаюсь справиться с этим, должен быть жизнеспособным подходом, но программа, похоже, даже не запускает метод события. system.out.println никогда не отображается.

import java.applet.Applet;
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;


public class MouseMove extends Applet implements KeyListener{

public static Random randomGenerator = new Random();
public static int code;

public void init(){
    addKeyListener(this);
}

public void keyPressed(KeyEvent evt){
    code = evt.getKeyCode();
    System.out.println("Key: "+KeyEvent.getKeyText(code));

    if(code == KeyEvent.VK_F1){
        System.exit(0);
    }
}

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

public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {

        Robot robot = new Robot();          

        while(true){

            robot.mouseMove((int)(Math.random()*1366), (int)(Math.random()*768));
            robot.delay(5000);
            robot.mouseWheel((int)(Math.random()*786));
            robot.delay(5000);
        }
    } catch (AWTException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}//main

}//class

person whitewolfpgh    schedule 20.12.2011    source источник
comment
На моей стороне ваша программа работает хорошо, вам нужно один раз щелкнуть апплет, чтобы System.out.println(); код показывает, какая клавиша нажата. Я не мог найти никаких проблем с этим.   -  person nIcE cOw    schedule 20.12.2011
comment
С моей стороны println() никогда не срабатывает. и программа продолжает выполняться без конца. :(   -  person whitewolfpgh    schedule 20.12.2011


Ответы (3)


  1. KeyListener работает, только если Component имеет Focus в окне.

  2. Вы должны создать visible контейнер.

  3. setFocusable() для компонента

  4. Лучше было бы использовать Swing JComponent.

  5. Используйте JFrame вместо JApplet.

person mKorbel    schedule 20.12.2011
comment
Я старался избегать каких-либо видимых объектов. Я хотел, чтобы программа оставалась невидимой и останавливала выполнение только при нажатии клавиши F1. Мой подход не сработает? - person whitewolfpgh; 20.12.2011
comment
затем вы играете с первым антивирусом, установленным на конкретном ПК - person mKorbel; 20.12.2011

Вы никогда не создаете экземпляр MouseMove. Ваш основной метод просто создает робота и начинает цикл. Если объект не существует, один из его методов никогда не может быть вызван.

person unholysampler    schedule 20.12.2011
comment
Все еще учась, думал, что init() позаботится об этом. Все, кроме MouseMove move = new MouseMove(); move.init() нужен в основном? Поскольку он по-прежнему не отвечает, это приводит к сбою IDE, но фактически не останавливает выполнение. Есть ли лучший способ изящно остановить выполнение? - person whitewolfpgh; 20.12.2011

Не используйте System.exit() при работе с апплетами. Взгляните на Java Applet (учебник). Вам нужно создать документ .htm и добавить тег <applet> для запуска апплета. Вы можете использовать инструмент AppletViewer или веб-браузер для запуска этого htm-документа.

файл.htm

<applet code="MouseMove" width="200" height="200"></applet>

запустите инструмент Appletviewer из командной строки или откройте .htm в веб-браузере.

>appletviewer file.htm
person kv-prajapati    schedule 20.12.2011