Събитие с натискане на клавиш на 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
От моя страна printl() никога не се задейства. и програмата продължава да се изпълнява без край. :(   -  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() необходим в main? Тъй като все още не отговаря, той срива IDE, но всъщност не спира изпълнението. Има ли по-добър начин за грациозно спиране на изпълнението? - person whitewolfpgh; 20.12.2011

Не използвайте System.exit(), когато работите с аплети. Разгледайте Java Applet (урок). Трябва да създадете .htm документ и да добавите <applet> таг, за да стартирате аплет. Можете да използвате AppletViewer инструмент или уеб браузър, за да стартирате този htm документ.

file.htm

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

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

>appletviewer file.htm
person kv-prajapati    schedule 20.12.2011