2015-03-17 3 views
0

Я пытаюсь создать собственный автокликер и не могу понять, как выйти из «щелчка» с помощью KeyListener. Я понимаю, что часть проблемы в том, что окно должно быть в фокусе для KeyListener для работы, но я не знаю, как это реализовать.Выход из цикла while с помощью KeyListener

Я добавлю весь код, чтобы вы могли сами убедиться, как его решить.

public class GUIMain extends JFrame { 
protected static GUIMain window = null; 
protected static Box mainFrame = new Box(BoxLayout.Y_AXIS); 
protected Click clicker = null; 

public GUIMain(String title) { 
    super(title); 
    mainBox(); 
    startRunning(); 

    this.addKeyListener(clicker); 
    this.toFront(); 
    this.pack(); 
    this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    this.setVisible(true); 
} 

public static void main(String[] args) { 
    window = new GUIMain("AutoClicker v0.1"); 
} 

protected void mainBox() { 
    this.setLayout(new BoxLayout(this.getContentPane(), 
      BoxLayout.Y_AXIS)); 
    mainFrame.setPreferredSize(new Dimension(250, 150)); 
    this.getContentPane().setBackground(Color.WHITE); 
    this.add(mainFrame); 
    mainFrame.add(Box.createVerticalGlue()); 
} 

protected void startRunning() { 
    JButton startButton = new JButton(" Start "); 
    mainFrame.add(startButton); 
    mainFrame.add(Box.createVerticalGlue()); 
    startButton.addActionListener(new ActionListener(){ 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      clicker = new Click(); 
     } 
    }); 

} 
} 

и теперь класс «Click», который реализует KeyListener. У меня есть часть i < 100 в цикле while, так что она не зацикливается навсегда, фиксируя ее.

public class Click extends JComponent implements KeyListener{ 
private static boolean runClicks = true; 
static Robot robot = null; 

public Click() { 
    mouseClick(); 
} 

protected static void mouseClick() { 
    int i = 0; 
    try { 
     robot = new Robot(); 
    } catch (AWTException e) { 
     e.printStackTrace(); 
    } 
    while(runClicks && i < 100) { 
      click(-1440, 540); 
      i++; 
    } 
} 

private static void click(int x, int y) { 
    robot.mouseMove(x, y); 
    robot.delay(50); 
    robot.mousePress(MouseEvent.BUTTON1_DOWN_MASK); 
    robot.mouseRelease(MouseEvent.BUTTON1_DOWN_MASK); 
} 

@Override 
public void keyPressed(KeyEvent e) { 
    if (e.getKeyCode() == KeyEvent.VK_F9) { 
     runClicks = false; 
    } 
} 

@Override 
public void keyReleased(KeyEvent e) { 
} 

@Override 
public void keyTyped(KeyEvent e) { 
} 
} 

Нужно ли думать о новом способе решения проблемы или может быть сделано с некоторыми изменениями?

ответ

0

Я не эксперт по Java каким-либо образом, но если вам нужно дать фокус окна, вы можете использовать вызов requestFocus().

public static void main(string[] args) { 
    JFrame frame = new JFrame(); 
    frame.add // whatever you want to add to your frame and sizing 
    frame.requestFocus(); 
    frame.pack(); 
    frame.setVisible(true); 
} 
+0

Спасибо, проблема в том, что он потеряет фокус каждый раз, когда мышь преформирует клик. Хотя, возможно, я могу добавить requestFocus во время цикла, чтобы он получал фокус каждый раз, когда он зацикливался. –

Смежные вопросы