当前位置: 首页 > 面试题库 >

是否需要在事件队列上运行机器人方法?

汪臻
2023-03-14
问题内容

机器人是AWT库的一部分,但它似乎与该库的所有其他部分大不相同。我正在创建一个Swing GUI,它将Swing与Java Native
Access(JNA)和Robot混合在一起,以允许Java驱动某些MS Windows /
Citrix工作程序。我的直觉是,由于机器人会将事件排队在“平台的本机输入队列”上,所以我最后要做的就是在EDT上运行它,但是另一方面,AWT和Swing库中的大多数类应该在Swing事件线程
运行。因此,为我想澄清一下这一点,让我尽可能具体地提出一个问题:

机器人方法(尤其是按键和释放,鼠标移动,鼠标按下和释放)应在Swing事件分配线程(EDT)上运行还是在之外运行?


问题答案:

Robot你提到的方法应该 不是
在美国东部时间运行。查看源代码后发现,这些“事件”方法中的每一个都有一个共同点(即afterEvent调用):

public synchronized void keyPress(int keycode) {
    checkKeycodeArgument(keycode);
    peer.keyPress(keycode);
    afterEvent();
}

public synchronized void mousePress(int buttons) {
    checkButtonsArgument(buttons);
    peer.mousePress(buttons);
    afterEvent();
}

// etc

private void afterEvent() {
    autoWaitForIdle();
    autoDelay();
}

private void autoWaitForIdle() {
    if (isAutoWaitForIdle) {
        waitForIdle();
    }
}

public synchronized void waitForIdle() {
    checkNotDispatchThread();
    /* snip */
}

private void checkNotDispatchThread() {
    if (EventQueue.isDispatchThread()) {
        throw new IllegalThreadStateException("Cannot call method from the event dispatcher thread");
    }
}

如果你调用任何这些方法在EDT而Robot.isAutoWaitForIdletrue,一个异常将被抛出。这有理由说明,即使isAutoWaitForIdlefalse,也不应从EDT调用这些方法。



 类似资料:
  • 问题内容: 在Java中,要创建并显示一个new ,我只需执行以下操作: 但是,我已经看到很多人这样做: 为什么?有什么好处吗? 问题答案: 在Java的生命周期中,用于控制需要在EDT上执行什么操作的规则(我看到的是“ EDT”比“事件队列”更常用)。而且每次“规则”更改时,Sun建议在EDT上进行越来越多的“ GUI相关”工作。 人们为什么在EDT上运行Java GUI? 因为官方指南建议这样

  • 我有从不同提供程序类提取消息的辅助线程。每个提供程序类添加/获取内部队列的消息。每个提供者只满足一个solace队列,而solace使用者将消息添加到队列的提供者。 多个工作人员可以接收提供程序的消息,处理它们,然后发送消息的ack(下面的message.commit()方法执行ack)。 情景 null null 提供程序类 //有一组工作线程可以读取这些队列

  • 问题内容: 以下代码: 是/是打开JDBC连接所必需的。 我听说现代JDBC驱动程序不再需要它。但是我无法在项目中将其删除,因为我遇到了异常。我正在使用Java7和tomcat7。 什么时候可以省略构建? 问题答案: 从JDBC 4.0开始,不需要Class.forName()。 这是JDBC的Java教程的摘录。 在 早期 版本的JDBC中,要获得连接,首先必须通过调用方法Class.forNa

  • 我是一个初学者程序员(或者在我看来是这样),我需要帮助在音乐机器人中实现一个队列。 目前,只有当队列中有一首歌时,队列才能正常工作。如果有更多的歌曲,那么递归开始(在=wait serverQueue(语音,消息)之后从def play开始并等待play(queue.pop(0),语音,消息)从队列开始),并且所有歌曲只是跳过。 我试图以不同的方式解决这个问题,例如,引入了第二个变量,但这并没有带

  • 问题内容: 我正在使用Microsoft机器人框架来创建机器人并将其集成到团队中。该漫游器的部分要求包括每天一次主动向用户发送消息。据我了解,我只能向在漫游器之后添加到team / groupChat或直接向漫游器发送消息的用户发送消息。我的问题是- 我可以以某种方式绕过此限制吗?我的一个朋友叫我去graphAPI的一项新功能,如新测试版的一部分- https://docs.microsoft.c

  • 问题内容: 可以在本地运行JAR文件。下一步是在另一台PC上运行它。 问题是运行JAR文件是否需要JRE,JDK或两者都需要? 问题答案: JDK包含JRE。 大多数程序仅需要JRE(Java运行时环境),但是某些程序在运行时需要编译器,在这种情况下,您需要JDK。 如果您拥有JDK,则也不需要JRE。