Java 当我运行autoclicker时,我可以';别停下来

Java 当我运行autoclicker时,我可以';别停下来,java,windows,swing,Java,Windows,Swing,如果我点击开始按钮,我不能点击后退或停止。我需要停止应用程序。停止应用程序的一种方法是,您必须关闭计算机电源:D。当应用程序运行时,开始按钮被锁定,我无法单击它。单击退出按钮不起作用。这个应用程序是简单的自动舔。java中是否存在比robot类更好的autoclicker?我怎样才能修好它?哪里有错误吗?或者我可以做些什么来停止应用程序 import java.awt.AWTException; import java.awt.BorderLayout; import java.awt.E

如果我点击开始按钮,我不能点击后退或停止。我需要停止应用程序。停止应用程序的一种方法是,您必须关闭计算机电源:D。当应用程序运行时,开始按钮被锁定,我无法单击它。单击退出按钮不起作用。这个应用程序是简单的自动舔。java中是否存在比robot类更好的autoclicker?我怎样才能修好它?哪里有错误吗?或者我可以做些什么来停止应用程序

 import java.awt.AWTException;
 import java.awt.BorderLayout;
 import java.awt.EventQueue;
 import java.awt.Robot;

 import javax.swing.JFrame;
 import javax.swing.JPanel;
 import javax.swing.border.EmptyBorder;
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;

 import java.awt.event.ActionListener;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
 import java.awt.Color;


public class AutoClicker extends JFrame {

private JPanel contentPane;
private final JLabel m = new JLabel("AutoClicker");

/**
 * Launch the application.
 */
public static void main(String[] args) {

    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                AutoClicker frame = new AutoClicker();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public AutoClicker() {

    setAlwaysOnTop(false);
    setTitle("AutoClicker");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 147, 162);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    JCheckBox chckbxOnTop = new JCheckBox("On Top");
     boolean onTop = false;
    chckbxOnTop.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

            if(chckbxOnTop.isSelected()){
                setAlwaysOnTop(true);
            }
            else{
                setAlwaysOnTop(false);
            }   

        }
    });
    chckbxOnTop.setBounds(6, 7, 97, 23);
    contentPane.add(chckbxOnTop);




    JCheckBox chckbxAutoclicker = new JCheckBox("AutoClicker");
    chckbxAutoclicker.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            while(chckbxAutoclicker.isSelected()){

                        try {
                            Robot r = new Robot();
                            r.mousePress(MouseEvent.BUTTON1_MASK);
                            r.setAutoDelay(1080);
                            r.mouseRelease(MouseEvent.BUTTON1_MASK);
                        } catch (AWTException e1) {

                            e1.printStackTrace();
                        }

                    }
                }



    });
    chckbxAutoclicker.setBounds(6, 80, 97, 23);
    contentPane.add(chckbxAutoclicker);
    m.setForeground(new Color(153, 102, 0));
    m.setBounds(16, 92, 120, 31);
    contentPane.add(m);
}
}

Swing是单线程的-在该线程上调用任何长时间运行的任务将锁定该线程(EDT),并防止任何绘制、事件等。。。避免发生。其中一个
ActionListener
实现创建了一个无限循环:

while(chckbxAutoclicker.isSelected()){
上述值永远不会计算为false,因为它是在EDT上计算的,并且在EDT空闲之前,事件(例如禁用
JCheckBox
以允许此方法返回false)不会发生。如果您希望在允许EDT执行其必要任务的同时继续运行任务,您有三个选项:

  • 创建一个新的。注意:从这个线程对Swing的任何调用都应该使用
    SwingUtilities.invoke*
  • 使用
  • 如果您希望稍后在EDT上做一些事情,或者在EDT上按计划运行一些事情,请使用

  • 为什么要使用两个嵌套的无限循环?你为什么要用
    来表示(;;)
    而不是
    来表示(某事)
    ?你希望你的程序除了挂断所有东西之外还能做什么呢?当我删除两个for循环并添加一个while循环时,它不能被关闭/停止。你甚至没有试图停止它,我编辑了currect代码。