java - 通过 Swing 按钮停止线程

标签 java multithreading swing

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

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

我是否创建一个 boolean 值,使线程仅在为真或类似的情况下运行?因为我尝试编辑触发器 boolean 值,但它没有任何影响。

代码如下:

运行线程的类

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

}

感谢您的帮助,我真的很感激。

最佳答案

java 上不再有 stopThread() api。您应该将标志设置为 volatile ,并且您的停止线程按钮只需设置标志变量值。

public volatile boolean flag;

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

关于java - 通过 Swing 按钮停止线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11917714/

相关文章:

java - Spring 中使用 Gson 的 Web 服务

c# - 使用 = 和 == 比较 boolean 值与 boolean 变量有什么区别?

c++ - std::vector 与一位读者和一位作者的多线程同步:仅在调整大小时锁定

java - 如何使用 ThreadPoolTask​​Executor 设置任务超时

java - 如何重新加载 JFrame - Java

java - 如何从网页上的链接部署JFrame接口(interface)?

java - 如何在Android Studio中线程处理录制音频?

java - 如何到达第一个Java线程0?

java - 两个分割 Pane 放置在一个选项卡上

java - TreeBasedTable 的 Guava TreeRow 没有排序,尽管它实现了 SortedMap?