2012-08-11 75 views
2

我做了一个简单的程序,它只是跟踪鼠标光标的坐标 - 它工作正常,我想要做的就是用按钮启动/停止它。通过摆动按钮停止线程

到目前为止,按钮启动线程,我可以安全地停止线程的最佳方式是什么?这是因为我可能会添加一个工具来将坐标写入文本文件中。

难道我做了一个布尔值,只有当它是真的或类似的东西时才让线程运行?因为我试图编辑触发器布尔值,但它并没有影响到什么。

,因为它的代码是:

类运行的线程

public class tester { 

static int startTime = (int) System.currentTimeMillis(); 
static boolean trigger = false; 
static JLabel label = new JLabel(); 
static JLabel status = new JLabel(); 
static mouseLocate msl = new mouseLocate(); 
static JButton startButton = new JButton("Begin tracking"); 
static JButton stopButton = new JButton("Stop Tracker"); 
static Thread myThread = new Thread(new mouseLocate()); 

public static void main(String[] args) { 
    JFrame frame = new JFrame("Mouse Grabber"); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(500, 100); 
    JPanel panel = new JPanel(); 
    frame.add(panel); 


    panel.add(startButton); 
    startButton.addActionListener(new startAction()); 

    panel.add(label); 
    panel.add(status); 
} 

static class startAction implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 

     try { 

      if (trigger == false) { 
       trigger = true; 
       msl.setTrigger(trigger); 
       //label.setText("Trigger Active" + msl.isTrigger()); 
       startButton.setText("Continue Tracking"); 
      } else if (trigger == true) { 
       trigger = false; 
       //msl.setTrigger(trigger); 
       label.setText("Trigger Inactive"); 
       startButton.setText("Stop Tracking"); 
      } 
     } catch (Exception exp) { 
      System.out.println("EXCEPTION CAUGHT " + e); 
     } 



     //RUN 
     myThread.start(); 


    } 
} 

鼠标定位类:

public class mouseLocate implements Runnable { 

private boolean trigger = false; 
private int startTime = (int) System.currentTimeMillis(); 
static String status = ""; 

public void run() { 
    int x, y; 
    while (mouseGrabber.trigger = true) { 

     try { 
      PointerInfo mouseLocation = MouseInfo.getPointerInfo(); 
      x = mouseLocation.getLocation().x; 
      y = mouseLocation.getLocation().y; 
      System.out.println("X:" + x + " Y:" + y + "  Elapsed time: " 
        + (((int) System.currentTimeMillis() - startTime)/100)); 

     } catch (Exception e) { 
      System.out.println("Exception caught : " + e); 
     } 
    } 

} 

public int getStartTime() { 
    return startTime; 
} 

public void setStartTime(int startTime) { 
    this.startTime = startTime; 
} 

public boolean isTrigger() { 
    return trigger; 
} 

public void setTrigger(boolean trigger) { 
    this.trigger = trigger; 
} 

public static String getStatus() { 
    return status; 
} 

public static void setStatus(String status) { 
    mouseLocate.status = status; 
} 

}

谢谢你的任何帮助,我真的欣赏它。

+0

'而(mouseGrabber.trigger =真)'永远是正确的。你可能想写'while(mouseGrabber.trigger)' – nkr 2012-08-11 21:31:47

回答

4

Java上没有stopThread()api了。您应该设置一个标志为易失性,并且您的停止线程按钮只需设置标志变量值。

public volatile boolean flag; 

public void run() { 
    while(flag) { 
     // Get coordinate or whatever you want  
    } 
} 
+0

你能解释一下实际的volatile吗?生病尝试你的解决方案,谢谢你! – alexeidebono 2012-08-12 09:37:48

+0

如果一个变量设置为volatile,保证任何线程访问变量读/写从/到内存不缓存。因此,变量值总是更新值,而不是脏(缓存)值。 – 2012-08-12 09:47:35

0
public volatile boolean isShutingDown; 



public void run() { 
    while(!isShutingDown) { 

    } 
} 

调用shutdown()方法,当你需要停止

public void shutDown(){ 

    isShutingDown = true 
    } 
+0

嗨,大家好,我尽我所能,但那里的按钮没有任何影响线程上的东西。它在程序启动时运行,只有在关闭它时才会停止,而不管标志是什么。 这里是代码[链接](http://pastebin.com/AihWCLsJ) 再次感谢您的任何帮助 – alexeidebono 2012-08-18 19:11:54