嘿我试图打开控制台"持有"什么时候拿钥匙。我正在使用小程序 因为这段代码是测试applet中的密钥保存。如果有任何具有良好java知识的人可以向我解释发生什么事情将非常感激。
我很确定问题可能与线程有关。
public class appletkeytest extends Applet implements KeyListener, Runnable {
boolean held;
public void init(){
addKeyListener(this);
Thread t = new Thread( this );
t.start();
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
held = true;
System.out.println(held);
}
public void keyReleased(KeyEvent e) {
held = false;
System.out.println(held);
}
public void run() {
System.out.println(held);
while(held){
System.out.println("holding");
}
}
}
答案 0 :(得分:1)
首先,我建议将held
定义为易失性。
其次,既然您从init()
方法启动线程,它将在您按下该键之前开始运行,从而立即完成。
我会像这样离开init
:
public void init() {
addKeyListener(this);
}
将keyPressed
侦听器更改为:
public void keyPressed(KeyEvent e) {
boolean wasHeld = held;
held = true;
System.out.println(held);
if ( !wasHeld) {
Thread t = new Thread(this);
t.start();
}
}
wasHeld
变量背后的原因是,当您按住某个键时,它实际上会发送多个keyPressed
个事件,直到它被释放。如果您刚为每个创建了一个线程,那么在一次按键操作期间会创建很多线程,所有这些线程都忙于写入您的控制台。
因此,只有在第一次为此特定按键发送keyPressed
事件时才想创建线程。在释放前一个键后再按一个键时,将创建一个新线程。