2

我有一个 JFrame,它是我的主要应用程序,该应用程序通过Robot类移动鼠标。我想运行我的扩展类Thread并让它能够启动、暂停和停止预定义的鼠标移动事件列表,并且还能够在主 JFrames 文本区域中写入以让用户知道发生了什么。

目前,我在鼠标移动的无限循环中启动线程,并在整个循环中更新主文本区域。它运行良好,但是在开始在 Netbeans 中重写我的应用程序后,我用来设计 JFrames 的设计器正在使用一个摆动文本区域,我认为该区域在线程 MouseMover 运行时不会更新其文本。

我已经这样定义了这个类

public class MouseMover extends Thread 
{

    MainView theApp;

    public void run()
    {
        try 
        {
            rob = new Robot();
        } 
        catch (AWTException e1) {mainView.newStatusLine("The Robot could not be created");return;}


        while(true) {}
    }

    public void setApp(MainView view)
    {
        theApp = view;

    public void doIt()
    {     
        while(true){
        // move mouse around screen
        rob.mouseMove(0, 100);
        theApp.statusTextArea.setText("moved the mouse");
        }
    }
}

我这样定义线程

public class MainView extends javax.swing.JFrame 
{
       static MouseMover mover;

       public MainView() 
       {
          mover = new MouseMover();
       }

       public void on_goBtn()
       {
           mover.doIt();
       }
 }

当我提出类似问题时,有人告诉我,我启动线程错误,我现在正在尝试修复它并添加更多功能。那么如何正确启动 MouseMover 线程,以便我的 JFrame 在线程也可以写入其文本区域时保持响应?更重要的是,我如何能够“暂停”MouseMover 的 doIt() 方法?

4

3 回答 3

2

而不是mover.doIt();您需要调用mover.start()方法来开始run在新线程中执行方法。有关启动线程的教程,请参阅此处

你的run方法应该是

public void run() { // instead of doIt     
    try {
        rob = new Robot();
    } 
    catch (AWTException e1) {mainView.newStatusLine("The Robot could not be created");return;}
    while(true){
    // move mouse around screen
    rob.mouseMove(0, 100);
    theApp.statusTextArea.setText("moved the mouse");
    }
}

另请阅读java 代码约定以避免这种方法名称:on_goBtn

于 2013-08-15T07:44:11.340 回答
2

它运行良好,但是在开始在 Netbeans 中重写我的应用程序后,我用来设计 JFrames 的设计器正在使用一个摆动文本区域,我认为该区域在线程 MouseMover 运行时不会更新其文本。

  • 您对Swing 中的Concurency有疑问,Swing 被指定为单线程,

  • EDT 是特殊线程,对已经可见的 Swing GUI 的所有更新都必须在 EDT 上完成,基本上 Swing GUI 不关心您从 EDT 更新 JTextArea,不会重新绘制任何内容,

  • Java7 中有重要的变化,大多数 Thread_Safe 方法(直到 Java7)都不是线程安全的

  • 你需要 ( statusTextArea.setText("moved the mouse");and AWT.Robot) 并且我假设有无限循环,那么SwingWorker不合适

    1. (Java6)从 Runnable@Thread 输出调用可以包装到 invokeLater (必须用于 Java7)

    2. (您的代码)输出必须从普通的普通线程(Java6/7)包装到 invokeLater

    3. 看看有问题的awt.Robot 是如何工作的机器人方法是否需要在事件队列上运行?(由@Hovercraft Full Of Eels

于 2013-08-15T08:12:55.050 回答
1

您似乎错过了thread.start代码中的第一件事,它实际上产生了一个线程并通过调用覆盖run方法开始并行执行。

于 2013-08-15T07:41:37.017 回答