2016-10-31 11 views
0

私はオートクリッカーを作成しようとしていますが、ユーザーが簡単にプログラムを停止できるように、キーイベントのキャッチに関する問題があります。何が間違っているのか全く分かりませんが、addKeyListenerもうまくいきません。誰かが助けてくれますか?ここでJava(Swing)がキーイベントを聞きます

は私のコードです:

AutoClickerMainクラス

package com.autoclicker; 

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingConstants; 

public class AutoClickerMain { 
    public static boolean generate = true; 
    public AutoClickerMain(){ 
     addKeyListener(new KeyInput()); 
    } 


    public static void main(String[] args) throws InterruptedException{ 
     JFrame frame = new JFrame("Auto Clicker"); 
     frame.setSize(1086, 1200); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JLabel label = new JLabel("AutoClicker", SwingConstants.CENTER); 
     frame.add(label); 
     frame.setLocationRelativeTo(null); 
     frame.setResizable(true); 
     frame.pack(); 
     frame.setVisible(true); 

     try { 
      Robot robot = new Robot(); 
      while (true){ 
       Thread.sleep(500); 
       robot.mousePress(InputEvent.BUTTON1_MASK); 
       robot.mouseRelease(InputEvent.BUTTON1_MASK); 
      } 
     } catch (AWTException e) { 
      e.printStackTrace(); 
     } 

    } 

} 

KeyInputクラス

package com.autoclicker; 

import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

public class KeyInput extends KeyAdapter { 

    @Override 
    public void keyPressed(KeyEvent event) { 
     AutoClickerMain.generate = false; 
    } 
} 

答えて

1

あなたはすべてのグローバル(OS)キーボードイベントをキャッチするためにJavaのスイングを使用してコードを書く傾けます。フォーカスがあなたのJFrameにある場合にのみ、キープレスイベントを捕捉することができます。 例:

KeyboardFocusManager.getCurrentKeyboardFocusManager() 
    .addKeyEventDispatcher(new KeyEventDispatcher() { 
     @Override 
     public boolean dispatchKeyEvent(KeyEvent e) { 
     System.out.println("Got key event!"); 
     return false; 
     } 
}); 

は、Javaを使用してアプリケーションにフォーカスすることなく、グローバルキーイベントをキャッチしたい場合は、JNIと高度なOS依存のコードが必要になります。

1

ユーザーが簡単にプログラムを停止できるようにします。

Exitメニュー項目を使用してJMenuを作成します。次に、メニュー項目に「アクセラレータ」を割り当てることができます。

詳細情報と例については、「メニューの使い方」のSwingチュートリアルのセクションを読んでください。

Closing an ApplicationにあるExitActionを使用してExitメニュー項目を作成できます。