当前位置: 首页 > 知识库问答 >
问题:

如何在Java中停止基于线程的操作事件

蒋鸿文
2023-03-14

我有一个程序,当你点击“开始”时移动鼠标光标

单击“开始”,我创建了一个新线程,光标开始移动。当我单击“暂停”时,即使变量设置为false,光标仍会移动。

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Font;

public class Main extends JFrame {
    private final long serialVersionUID = 1L;
    private JPanel contentPane;
    private static final int TEN_SECONDS = 10000;
    private boolean moving = false;
    Thr thr;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Main frame = new Main();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Main() {     
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);

        JButton start = new JButton("Start");
        start.setFont(new Font("Lucida Grande", Font.PLAIN, 15));
        start.setLocation(163, 20);
        start.setSize(146, 53);
        start.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.print("started");
                MouseMoveLogic(true);
                return;
            }
        });
        contentPane.setLayout(null);
        contentPane.add(start);

        JButton pause = new JButton("Pause");
        pause.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.print("paused");
                MouseMoveLogic(false);
                return;
            }
        });
        pause.setFont(new Font("Lucida Grande", Font.PLAIN, 15));
        pause.setBounds(163, 102, 146, 53);
        contentPane.add(pause);

        JButton quit = new JButton("Quit");
        quit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        quit.setFont(new Font("Lucida Grande", Font.PLAIN, 15));
        quit.setBounds(163, 191, 146, 53);
        contentPane.add(quit);



    }

    public void MouseMoveLogic(boolean flag) {
        Thr thr = new Thr(moving, flag);
        thr.start();
    }
}
import java.awt.AWTException;
import java.awt.Robot;
import java.util.Random;

public class Thr extends Thread {
    private static Robot robot;
    private static final int MAX_Y = 400;
    private static final int MAX_X = 400;
    private boolean moving;
    private boolean flag;

    public Thr(boolean moving, boolean flag) {
        this.moving = moving;
        this.flag = flag;
    }

    @Override
    public void run() {
        try {
            if (robot == null) {
                robot = new Robot();
            }

            Random random = new Random();

            if (!flag && moving) {
                moving = flag;
            } else if (flag) {
                moving = flag;
            }

            while (moving) {
                robot.mouseMove(random.nextInt(MAX_X), random.nextInt(MAX_Y));
                robot.delay(2000);
            }

            if (!moving) {
                System.out.println("Trying to stop"); //this is printed when I click 'Pause' so the event is being registered as expected
                Thread.currentThread().interrupt();
            }

        } catch (AWTException e) {
            e.printStackTrace();
        }
    }
}

我不明白为什么当我点击“暂停”时,鼠标会一直移动,即使移动设置为false。

有人能看出我哪里出了问题,或者是否有更好的方法来解决这个问题吗?

共有1个答案

融泓
2023-03-14

我不明白为什么当我点击“暂停”时,鼠标会一直移动,即使移动设置为false。

public void MouseMoveLogic(boolean flag) {
    Thr thr = new Thr(moving, flag);
    thr.start();
}

你开始一条新的线索。所以旧线程仍在执行。不要开始新的线程

您需要保留对原始线程的引用。然后需要向实现线程的类添加一个方法,比如setMoving(Boolean moving)。然后调用setMoving(…)方法来启动/停止运动。

如果有更好的方法解决这个问题?

您应该使用Swing计时器来安排事件。计时器已经有了可以调用的停止/启动方法。

有关详细信息,请阅读Swing教程中关于如何使用计时器的部分。

一个简单的例子让你开始:Jlabel显示新旧数字

 类似资料:
  • 问题内容: 我已经用GUI制作了一个Java程序,并且想要一个停止按钮功能,其中当用户单击停止按钮时,必须停止该程序。 在我的程序中,主线程启动其他10个线程,我希望每当单击“停止”按钮时,所有10个线程都必须在主线程之前停止。 其次,我还希望每当停止这10个线程中的任何一个线程时,它都必须先关闭它打开的所有资源,然后再连接数据库等。 我已经实现了.......回答的代码。 现在有一个问题。 我的

  • 问题内容: 我有一个执行以下代码的线程: 哪里是。如何才能优雅地停止此类线程?关闭或使用均无效。 问题答案: 这是因为读取System.in(InputStream)是一项阻塞操作。 在这里看是否可以从InputStream读取超时? 这是一种从System.in获取NIO FileChannel并使用超时检查数据可用性的方法,这是问题中所述问题的特例。在控制台上运行它,不要键入任何输入,然后等待

  • 问题内容: 我正在尝试停止线程,但是我不能这样做: 因此,即使我调用方法“停止”,线程也不会停止。它一直活着。 如何中断/停止该线程? 更新 (@little方法) 中间件类: 但是,当我尝试停止线程时,它没有。 上面的代码有什么问题? 问题答案: 确实没有必要使用标志。相反,只需使用来查询线程的状态。另外,为什么还要将线程对象包装在另一个线程对象中?对我来说,这似乎完全没有必要。 这是你应该做的

  • 问题内容: 如果我有这样的Java代码: 并在调试中运行它,我可以看到所有这些线程(在取消之后)仍在运行,所以它们也占用了我的内存吗?如果是的话,我怎么能完全销毁那些线程? 问题答案: 调用您的线程,仅此而已。因此,您需要在您的方法中正确处理它。对于您的简单情况,您的线程将完成其执行,并且它们的对象将由GC清除。

  • 问题内容: 我正在编写一段连接到服务器的代码,使用该连接会生成一堆线程并执行一堆“工作”。 在某些情况下,连接失败,我需要停止所有操作并从头开始创建新对象。 我想在对象之后进行清理,但在线程上调用thread.stop,但是此方法似乎已被弃用。 推荐的替代方法是什么?是否应该为每个线程编写自己的清理和退出方法?将线程设置为null?或者是其他东西? 问题答案: 看这里 : 在HowToStopAT

  • 问题内容: 我需要一个解决方案来正确停止Java中的线程。 我有实现Runnable接口的类: 我有启动和停止线程的类: 但是当我关闭时,我在类中得到了异常: 我正在使用JDK 1.6。所以问题是: 如何停止线程并且不引发任何异常? PS我不想使用;方法,因为它已过时。 问题答案: 在类中,你需要一种设置标志的方法,该标志通知线程它将需要终止,类似于你刚刚在类范围中使用的变量。 当你希望停止线程时