Работа с KeyEvents в Java - PullRequest
       165

Работа с KeyEvents в Java

0 голосов
/ 26 марта 2009

Скажем, у меня есть графический интерфейс, и я хочу, чтобы программа фактически запускалась при нажатии пробела, но если снова нажать пробел, то я хочу, чтобы программа закрылась. Будет ли что-то вроде этой работы?

public class MouseClicker extends JApplet implements KeyListener{
int counter = 0;
MouseClicker m1 = new MouseClicker();

//all of the other methods

public void keyPressed( KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode==KeyEvent.VK_SPACE){
 m1.click();
 counter ++;
 if(counter%2==0)
  System.exit(0);
}
//other methods needed for KeyListener
}

Ответы [ 2 ]

2 голосов
/ 26 марта 2009

Попробуй и посмотри; -)

Если серьезно, что вы хотите запрограммировать на запуск при нажатии пробела? Если программа уже не запущена, как вы собираетесь получить KeyEvent?

Что касается другой половины вашего вопроса, то ваш код должен, в общем, заставить Java завершаться при нажатии клавиши пробела. Обратите внимание, что нет смысла использовать счетчик, поскольку, как только Java завершает работу, значение счетчика теряется. Также обратите внимание, что JApplet является исключением из «в общем» ... обычно вы не можете вызвать System.exit из апплета, потому что апплет работает под управлением браузера, и Java должен завершаться только тогда, когда Пользователь закрывает браузер, а не всякий раз, когда ваш апплет завершен. Могут быть другие апплеты, работающие в той же JVM, и они, возможно, еще не закончили с тем, что они делают.

0 голосов
/ 26 марта 2009

Возможно, я думаю, что код AWT правильный, но все остальное ужасно загадочно (не то, чтобы я этого не понимал, но это не отражает того, что вы на самом деле делаете очень хорошо, не так ли?)

Как насчет:

boolean running=false;

...
if(running)
    System.exit(0);
else
    running=true;

вместо

Обновление: Прочитав ваше обсуждение в другом посте, вы почувствуете некоторую странность.

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

Я предлагаю посмотреть на SwingTimer. Установите таймер колебания, чтобы он уведомлял вас каждые несколько мс, и это уведомление будет поступать в потоке AWT, чтобы вы могли использовать его, чтобы нажать кнопку, а затем просто выйти и дождаться следующего события таймера. .

Когда они снова нажимают пробел, system.exit () должен работать нормально.

...