当我运行自动转向器时,我无法阻止它

时间:2016-08-15 10:20:18

标签: java windows swing

如果我点击开始按钮,我就无法点击或停止。我需要停止应用程序。停止应用程序的一种方法是必须关闭计算机电源:D。当应用程序运行时,启动按钮被锁定,我无法点击它。点击退出按钮不起作用。这个应用程序是简单的AutoClicker。在java中存在比机器人类更好的自动更新功能吗?我该如何解决?任何地方都有错误吗?或者我可以做些什么来阻止应用程序?

 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);
}
}

1 个答案:

答案 0 :(得分:2)

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

while(chckbxAutoclicker.isSelected()){

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

  1. 创建新的Thread。请注意,应使用SwingUtilities.invoke*
  2. 将此线程中对Swing的任何调用发送到EDT
  3. 使用SwingWorker
  4. 如果您希望稍后在美国东部时间做某事,或在美国东部时间按计划运行某些内容,请使用javax.swing.Timer