按下 JButton 时运行函数

2024-07-01

我正在尝试用java编写一个程序,使用机器人每隔几秒按一次特定的键。它有一个带有开始和停止按钮的 GUI,以及一个告诉其处于哪个状态的标签。到目前为止,我已经完成了所有工作,除了当我单击“开始”时,它运行我的机器人功能的循环(这是无限的)没有像我想象的那样启用停止按钮。我知道无限循环的放置位置很愚蠢,但我不确定如何使其正常工作。

我不做很多java工作,这只是我想尝试的一件有趣的事情,但中途被卡住了。任何帮助表示赞赏。

import java.awt.AWTException;
import java.awt.FlowLayout;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main extends JFrame {

    /**
    * 
    */
    private static final long serialVersionUID = 1L;
    private static boolean running = false;;
    private JButton start_button;
    private JButton stop_button;
    private JLabel tl;
    private static int i = 0;
    Robot robot;

    void start() {

        JFrame frame = new JFrame("Helper");
        tl = new JLabel("Running: " + running);
        start_button = new JButton("Start");
        stop_button = new JButton("Stop");
        stop_button.setEnabled(false);
        frame.add(tl);
        frame.add(start_button);
        frame.add(stop_button);
        frame.setSize(300, 100);
        frame.setVisible(true);
        frame.setLayout(new FlowLayout());
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setLocation(400, 400);

        try {
            robot = new Robot();
        } catch (AWTException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
        robot.setAutoDelay(200);

        start_button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                start_button.setEnabled(false);
                stop_button.setEnabled(true);
                running = true;
                tl.setText("Running: " + running);
                while (running) {
                    robot_loop(robot);
                }

            }
        });
        stop_button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                start_button.setEnabled(true);
                stop_button.setEnabled(false);
                running = false;
                tl.setText("Running: " + running);

            }
        });

    }

    public static void main(String[] args) {
        new Main().start();

    }

    private static void robot_loop(Robot robot) {

        robot.keyPress(KeyEvent.VK_NUMPAD0);
        robot.keyRelease(KeyEvent.VK_NUMPAD0);

        System.out.println("numpad 0 pressed! - " + i);
        i++;

    }

}

我已将我的评论改编为答案。

这些事件侦听器的 actionPerformed 方法在 Swing 的事件分派线程上调用,并且由于您进入了无限循环,因此它将导致 GUI 冻结。您可以在 actionPerformed 方法内创建一个线程,并在新线程内完成工作。尽管您遇到的下一个问题是找到一种好方法来在用户按下停止按钮时停止线程。

很酷的是,您已经在代码中获得了执行此操作的所有逻辑。因此,让它发挥作用就像更改一样简单:

    start_button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            start_button.setEnabled(false);
            stop_button.setEnabled(true);
            running = true;
            tl.setText("Running: " + running);
            while (running) {
                robot_loop(robot);
            }

        }
    });

要在自己的线程上完成工作:

    start_button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            start_button.setEnabled(false);
            stop_button.setEnabled(true);
            running = true;
            tl.setText("Running: " + running);
            Executors.newSingleThreadExecutor().submit(new Runnable() {
                @Override public void run() {
                    while (running) {
                        robot_loop(robot);
                    }
                }
            });
        }
    });

上面的代码使用了执行器框架(java.util.concurrent.*),而不是直接创建线程。 nachokk 建议的另一种选择是使用计时器java.util.Timer or javax.swing.Timer(在这种情况下应该没问题)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按下 JButton 时运行函数 的相关文章

  • 即使凭据正确,Spring-security 也不会登录用户

    谁能指出我的错误 我一开始无法使用注册用户登录 我以为是因为我正在加密密码 但即使现在我已经删除了编码 即使使用明文密码 用户仍然无法登录 这是我的 web xml
  • Java可以用来写Win32系统服务吗?

    标题有点概括了 我正在考虑使用Jabaco http www jabaco org因为它生成 EXE 以及 jar 文件 而且我对 VB 语法比对 Java 更熟悉 你当然可以用Java 服务包装器 http wrapper tanukis
  • 在android 2.3.6中如何通过联系人提供程序获取联系人照片?

    我有这个适用于 android 4 的版本 String email是 Gmail 地址 private Uri getPhotoUriFromEmail String email Uri u null String projection
  • 按下 JButton 时运行函数

    我正在尝试用java编写一个程序 使用机器人每隔几秒按一次特定的键 它有一个带有开始和停止按钮的 GUI 以及一个告诉其处于哪个状态的标签 到目前为止 我已经完成了所有工作 除了当我单击 开始 时 它运行我的机器人功能的循环 这是无限的 没
  • 将 float 转换为 Short,精度损失最小[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个生成浮点值 例如 0 37885 的正弦波 但我希望它们作为短裤 直接使用 Short 进行转换 得到的值为 0 那么解决方案是什么
  • 有人可以推荐 java 8 模式来替换 switch 语句吗?

    我有以下代码 public class A private String type String getType return type 现在在许多代码位置我都有这样的代码 switch a geType case A return new
  • 数组等于忽略顺序[重复]

    这个问题在这里已经有答案了 可能的重复 Java 检查数组的相等性 顺序无关紧要 https stackoverflow com questions 10154305 java checking equality of arrays ord
  • 您可以链接两个 JFormattedTextField 的值吗?

    我有一个带有 2 个 JFormattedTextFields 的界面 我需要它们的值 不仅仅是显示的文本 相同 理想情况下 它们都应该是可编辑的 其中一个的更改会反映在另一个中 我一开始只是在两者之间共享一个文档 但很快就遇到了一个问题
  • Java 中是否可以使用原始类型(int)作为泛型类型?

    具体来说 用一个SortedMap
  • 使用 Spring Security 标记库时将异常映射到 404 页面

    将异常映射到 404 页面时 Spring Security 标记无法从安全上下文中找到身份验证信息 通过 真实 404 可以找到身份验证 我的 web xml
  • 在内存对象缓存中开发

    我正在开发一个基于网络的医疗应用程序 需要创建一个小型内存对象缓存 这是我的用例 我们需要显示需要某些东西 血液 肾脏等 的人提交的请求列表 并且它不会是一个巨大的列表 因为在某一天对血液或其他任何东西的请求将是有限的 请注意 我们不想使用
  • 从 Runnable 类内部访问共享变量

    我需要在主类的 main 方法中定义一个共享变量 我需要两个线程才能访问该共享变量 我通过实现 Runnable 接口并实现该接口的抽象 run 方法来创建线程 如何从实现 Runnable 接口的类中定义的 run 方法中引用 Main
  • Spring Boot Rest - 如何配置 404 - 找不到资源

    我得到了一个有效的春季靴休息服务 当路径错误时 它不会返回任何内容 完全没有反应 同时它也不会抛出错误 理想情况下 我预计会出现 404 未找到错误 我有一个 GlobalErrorHandler ControllerAdvice publ
  • Java双精度求和问题

    我想知道为什么我会收到此错误 这是Eclipse调试的显示日志 var double 2 8 tot getIva java lang Double 0 17 var tot get double 2 9699999999999998 我不
  • RMI服务器异常

    当我尝试运行使用远程注册表的服务器时 我收到以下来自 RMI 的异常 我的 Server2 类中 main 方法的注册表代码是 Registry registry LocateRegistry getRegistry 192 168 1 4
  • CodenameOne 在构建后停止工作

    我对 codenameone 有一个奇怪的问题 我什至不确定出了什么问题 我尝试过 发送 Windows Phone 版本 并且从那时起我认为我没有更改任何其他内容 然而 在我这样做之后 模拟器无法启动并一直说我的导入是错误的 事实并非如此
  • Java中从long到float的信息丢失[重复]

    这个问题在这里已经有答案了 如果你调用Java的以下方法 void processIt long a float b a do I have loss here 当我将 long 变量分配给 float 变量时 是否会丢失信息 Java 语
  • Java:Set接口和Collection接口的区别

    我刚刚查了一下Set接口 发现它大部分 或完全 只重新声明已经存在于Collection界面 Set本身延伸Collection 所以这是否意味着Set界面自动具有所有功能Collection 那么为什么要重新声明它们呢 例如 Set重新声
  • Spring Security 登录页面

    我开发了一个使用 Spring Security 的默认登录页面的应用程序 不过我想实现我自己的登录页面 我将放置一个login html 而不是jsp 页面 我想使用 JQuery 来实现它 我检查了很多例子但无法实现 我是 Spring
  • 计算时间复杂度和 Big-O 表示法 [重复]

    这个问题在这里已经有答案了 我的以下代码的 Big O 表示法的时间复杂度是多少 计算它的步骤是什么 import java io File import java io FileNotFoundException import java

随机推荐