Java 当我运行autoclicker时,我可以';别停下来
如果我点击开始按钮,我不能点击后退或停止。我需要停止应用程序。停止应用程序的一种方法是,您必须关闭计算机电源:D。当应用程序运行时,开始按钮被锁定,我无法单击它。单击退出按钮不起作用。这个应用程序是简单的自动舔。java中是否存在比robot类更好的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
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执行其必要任务的同时继续运行任务,您有三个选项:
SwingUtilities.invoke*
为什么要使用两个嵌套的无限循环?你为什么要用
来表示(;;)
而不是来表示(某事)
?你希望你的程序除了挂断所有东西之外还能做什么呢?当我删除两个for循环并添加一个while循环时,它不能被关闭/停止。你甚至没有试图停止它,我编辑了currect代码。