0

循环完成后,所有按钮和文本字段都可以使用,但是当循环运行时,什么都不能点击。我尝试了很多不同的东西,查看了很多不同的网站,但没有什么能帮助我。我不知道出了什么问题!

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

 public class J extends JFrame implements ActionListener{    
    JButton start = new JButton("Start (F12)");
    JButton stop = new JButton("Stop");

    int i;
    JLabel delay = new JLabel("Delay: ");
    JTextField delayJTF = new JTextField(4);
    int delayS = 0;
    GridLayout bl = new GridLayout(10, 10);
    public J() 
    {      

    super("Auto Clicker");
    start.addActionListener(this);
    stop.addActionListener(this);
    setSize(300, 300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(bl);
    add(delay, BorderLayout.NORTH);
    add(delayJTF, BorderLayout.NORTH);
    add(start);
    add(stop);
    setVisible(true);




     }

      boolean run = false;



          public static void main(String[] args) {
         J j = new J();

       }
        public void robott() {
         try {

      Robot robot = new Robot();

       Thread.sleep(delayS);
    robot.mousePress(InputEvent.BUTTON1_MASK);    
     robot.mouseRelease(InputEvent.BUTTON1_MASK);
   // robot.delay(delayS);

   } catch(Exception exc) {
      System.out.println(exc);

  }
      }

    public void actionPerformed(ActionEvent e) {
    String delaySt = delayJTF.getText();
    delayS = Integer.parseInt(delaySt);
    System.out.println(delayS);

    while(i < 100) {
        i++;          
      robott();
      System.out.println(i);
    }


   }

 }


     any suggestions?
4

5 回答 5

7

您在 Event Dispatch Thread 中循环 - 处理 GUI 绘画和用户输入的线程。所有动作事件都在该线程上处理。如果您需要执行长时间运行的任务(以及 I/O 等其他阻塞操作),您应该考虑将这些任务卸载到工作线程。查看本教程以获取更多信息。

于 2012-07-24T05:07:42.410 回答
1

我已经修改了你的代码现在它正在工作.....你可以了解更多关于工作线程的信息

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

 public class J extends JFrame implements ActionListener{    
JButton start = new JButton("Start (F12)");
JButton stop = new JButton("Stop");

int i;
JLabel delay = new JLabel("Delay: ");
JTextField delayJTF = new JTextField(4);
int delayS = 0;
GridLayout bl = new GridLayout(10, 10);
public J() 
{      

    super("Auto Clicker");
    start.addActionListener(this);
    stop.addActionListener(this);
    setSize(300, 300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(bl);
    add(delay, BorderLayout.NORTH);
    add(delayJTF, BorderLayout.NORTH);
    add(start);
    add(stop);
    setVisible(true);




}

boolean run = false;



public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            J j=new J();
        }
    });

}
public void robott() {
    try {



        Robot robot = new Robot();
        Thread.sleep(delayS);
        robot.mousePress(InputEvent.BUTTON1_MASK);    
        robot.mouseRelease(InputEvent.BUTTON1_MASK);


    } catch(Exception exc) {
        System.out.println(exc);

    }
}

public void actionPerformed(ActionEvent e) {


             WorkerThread  wt=new WorkerThread();
            wt.execute();

}
class WorkerThread extends SwingWorker<Void , Void>{

    @Override
    protected Void doInBackground() throws Exception {
        String delaySt = delayJTF.getText();
        delayS = Integer.parseInt(delaySt);
        System.out.println(delayS);
        while(i < 100) {

            i++;          
            robott();
            System.out.println(i);
        }
        return null;
    }

}

}

于 2012-07-24T05:18:30.923 回答
1

正如已经指出的,所有长时间运行的任务都必须在与事件调度循环线程不同的线程上执行。另一方面,与 GUI 元素的所有交互都必须发生在事件调度线程上。

在 Dangling Piyush 的示例中,WorkerThread调用robott()Robot。在这种情况下,机器人调用是“安全的”。

但是,如果要与 Swing GUI 元素进行任何直接交互,则必须将这些交互重新路由回 Event Dispatch Loop 的线程。

方法 A:SwingWorkerpublish/ process。用代码覆盖process以更新 GUI。publish从您的 实现中调用doInBackground,它“计划”process从事件调度循环(在它的线程上)调用。这有助于将数据作为参数跨该边界移动。

方法 B:使用您定义的 Runnable 调用SwingUtilities.invokeLater(Runnable doRun)以更新 GUI 元素。该可运行对象将在所需线程上运行。

于 2012-07-24T05:49:42.313 回答
1

这是因为您运行 GUI 并在一个线程中循环。您可以在方法 actionPerformed() 上设置一个断点。会发现它仍在运行不能接受任何其他事件的while 块。

于 2012-07-24T06:15:13.090 回答
0

您应该在单独的线程中运行 while 循环。您不能按任何按钮,因为您在 while 循环的同一个 GUI 线程中运行。请记住,swing 组件不是线程安全的,因此稍后在所有组件中使用调用。

于 2012-07-24T05:09:28.513 回答