ここで私のプログラムについて少し助けが必要です。ユーザーが「Enter」をクリックするのをメインスレッドで待機しているブロック機能があります。次に、ユーザーが Enter キーを押すと、keypressed イベントが発生し、ブロック機能のブロックが解除されます。ただし、プログラムがブロッキング関数にヒットすると、単にフリーズし、キーが押されたイベントを登録しません。
だから、私の質問は、ユーザーがクリックするたびにスレッドに追加される実行可能なイベントですか? もしそうなら、私のコードはうまくいったはずですよね?これが当てはまらず、各イベントが個別のスレッドではない場合、ここで問題を解決する方法について教えてもらえますか? 私のブロッキング機能:
public String getInput() {
synchronized(waitObject) {
try {
System.out.println("waiting");
waitObject.wait(); // throws exception, cba to add it here
} catch (Exception ex) {
ex.printStackTrace();
}
}
return(myString);
}
私のキーリスナーコード:
public void keyPressed(KeyEvent e) {
System.out.println("key pressed");
char c = e.getKeyChar();
if (c == e.VK_ENTER) {
System.out.println("Enter pressed");
synchronized(waitObject) {
waitObject.notifyAll();
}
}
}
および入力を取得する関数:
private String getCommand() {
System.out.println("getting command");
CommandField command = new CommandField((JFrame)(this));
command.setPreferredSize(new Dimension(getWidth(), 30));
m_panel.add(command, BorderLayout.NORTH);
validate();
command.requestFocus();
System.out.println(command.getInput());
return null;
}
そして、この関数は別のキーリスナーから呼び出されます:
public class Listener implements KeyListener {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_F2) {
System.out.println(getCommand());
}
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
}