当我运行我的自动刷新,我无法阻止它

如果我点击开始button,我不能点击返回或停止。 我需要停止应用程序。 停止应用程序的一种方法是,您必须closures电脑:D。 当应用程序正在运行时,启动button被locking,我不能点击它。 点击退出button不起作用。 这个应用程序是简单的AutoClicker。 在java中存在比机器人类更好的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); } } 

Solutions Collecting From Web of "当我运行我的自动刷新,我无法阻止它"

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

 while(chckbxAutoclicker.isSelected()){ 

以上将永远不会被评估为false,因为它正在EDT上进行评估,并且事件(例如禁用JCheckBox以允许此方法返回false)在EDT被释放之前不会发生。 如果您希望在执行必要任务时持续执行任务,您有三种选择:

  1. 创建一个新的主题 。 请注意,从该线程调用Swing应该使用SwingUtilities.invoke*
  2. 使用SwingWorker
  3. 如果您希望稍后在EDT上执行某些操作,或在EDT上按计划运行某些内容,请使用javax.swing.Timer