2009-03-26 14 views
0

私はGUIを持っていて、スペースバーが押されたときにプログラムを実際に実行したいとしますが、スペースバーが再度押されたらプログラムを終了します。この作品のようなものはありますか?javaのKeyEventsを扱う

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 
} 
+0

カウンタは実際には揮発性でなければならないことに注意してください。 – Eddie

答えて

2

それを試してみて、

;-)冗談はさておき見、何をあなたは、スペースバーを押したときに実行するようにプログラムしたい意味ですか?プログラムが既に実行されている場合を除き、KeyEventはどうやって受信されますか?

質問のもう半分については、スペースバーを押したときに一般にJavaコードを終了する必要があります。 Javaを終了するとすぐにカウンタの値が失われるので、カウンタの使用には注意が必要ではないことに注意してください。また、JAppletは「一般」の例外です...アプレットはブラウザの制御下で動作し、ユーザはブラウザを閉じたときに終了するだけであるため、通常はアプレットからSystem.exitを呼び出すことはできませんあなたのアプレットが完了したときではありません。同じJVMで実行中の他のアプレットが存在する可能性があり、まだ実行中のもので完了しない可能性があります。

+0

私は質問をひどく言いました、それについて申し訳ありません。私が実行することによって、私はスペースバーが押されるまでクリック間の時間間隔で何度も同じ領域を何度もクリックし続けるclick()メソッドを実行することを意味しました。スレッドが必要なのでしょうか? – Azreal

+0

また、私はこのプログラムをWebページに入れるのではなく、代わりにアプリケーションにすることを意味しました。 Javaは私の唯一の言語です。私がこれを実行することを知っている唯一の方法は、コンパイラから直接プログラムを実行することです。プログラムをアプリとして実行する方法はありますか? – Azreal

+0

はい。 public static void main(String [] args)メソッドで開始し、GUIのコンテナとしてJAppletの代わりにJFrameを使用します。その点についてさらに詳しい情報が必要な場合は別の質問をしてください。 –

0

はおそらく、私はAWTのコードが正しいですが、残りはひどく不可解である(私はそれを理解していないということはないが、それはあなたが実際には非常によくやっていることを表現していない、それがない?)だと思います

方法について:代わりに

boolean running=false; 

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

更新: 他の投稿でディスカッションを読んだら、少し違和感があります。

AWTスレッドのこの概念があります。 AWTで行われたすべては、そのスレッド上で実行されなければなりません。したがって、スペースバーが押されると、そのイベントがAWTスレッドで取得されます。あなたがそれを保持する限り、それは他のグラフィックスの更新を防ぐので、あなたはおそらくそれを保持したくないでしょう。

スイングタイマーを設定するスワイアタイマーを設定すると数ミリ秒ごとに通知され、その通知がAWTスレッドに来るので、ボタンをクリックして終了して次のタイマーを待つだけですイベント。

スペースバーをもう一度押すと、system.exit()が正常に動作するはずです。

+0

javaで事前定義されたブール値を実行していますか? – Azreal

+0

いいえ、コードの最初の行が私のabout:textに追加されました。 –

関連する問題