Я пытаюсь создать собственный автокликер и не могу понять, как выйти из «щелчка» с помощью 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) {
}
}
Нужно ли думать о новом способе решения проблемы или может быть сделано с некоторыми изменениями?
Спасибо, проблема в том, что он потеряет фокус каждый раз, когда мышь преформирует клик. Хотя, возможно, я могу добавить requestFocus во время цикла, чтобы он получал фокус каждый раз, когда он зацикливался. –