【问题标题】:Robot is printing the same string over and over again机器人一遍又一遍地打印相同的字符串
【发布时间】:2018-10-08 13:14:40
【问题描述】:

所以我正在编写一个代码,其中有一个 txt 文件,其中三个单独的行中有三个名称。运行代码后,我打开我的 MS Word,应用程序延迟 1 分钟。然后,该代码应该将我文件中的所有名称打印到 MS Word 中。

但是我的代码正在做的是,它只是将我的 txt 文件中的姓氏打印了三遍。现在我已经在我的 IDE 中使用 System.out.println() 打印了名称,并且正在打印所有名称。问题是当机器人在 MS Word 中键入名称时。请问谁能解决这个问题?

   Scanner sc = new Scanner(br);
        String scan = sc.nextLine();
        TimeUnit.MINUTES.sleep(1);
        while (scan != null) {
            System.out.println("I am here");
            System.out.println(scan);
            scan = "@" + scan;
            StringSelection sl = new StringSelection(scan);
            Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
            cb.setContents(sl, sl);

            Robot robot = new Robot();
            robot.keyPress(KeyEvent.VK_CONTROL);
            robot.keyPress(KeyEvent.VK_V);
            robot.keyRelease(KeyEvent.VK_V);
            robot.keyRelease(KeyEvent.VK_CONTROL);

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

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


            if (sc.hasNext()) {
                scan = sc.nextLine();
            } else {
                break;
            }
        }

所以我的txt文件是这样的

  Ned Stark
  Arya Stark
  Robb Stark

并没有输入所有这些名称,而是输入了以下内容

   @Robb Stark
   @Robb Stark
   @Robb Stark

【问题讨论】:

  • 你的代码抛出异常:java.lang.IllegalStateException: cannot open system clipboard
  • @RoshanaPitigala 它不在我的系统上...
  • @RoshanaPitigala 它也不在我的系统上。你在运行代码之前打开过你的 MS Word 吗?
  • Thenoob 我想知道你是否尝试过“Clipboard.getData()”或类似的东西,看看是剪贴板还是机器人有问题。
  • @JavaScriptCoder 我没有。我现在正在尝试,完成后我会告诉你。谢谢:)

标签: java string clipboard awtrobot


【解决方案1】:

while 循环中再添加 1 秒延迟将解决您的问题。

TimeUnit.SECONDS.sleep(1);

这是代码。我做了一些修改。

Scanner sc = new Scanner(new File("D:\\f.txt"));
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
Robot robot = new Robot();

TimeUnit.SECONDS.sleep(2); // Increase the initial sleep time if necessary.

while (sc.hasNextLine()) { // use hasNextLine() so you can get rid of the if block at the end of the code

    TimeUnit.SECONDS.sleep(1); // added another 1 second sleep
    String scan = sc.nextLine();
    scan = "@" + scan;
    System.out.println(scan);
    StringSelection sl = new StringSelection(scan);

    cb.setContents(sl, sl);

    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_CONTROL);

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

    robot.keyPress(KeyEvent.VK_SPACE);
    robot.keyRelease(KeyEvent.VK_SPACE);
}

【讨论】:

  • @Roshaba Pitigala 是的,它现在工作正常。谢谢!还有一件事。机器人应该在打字时在输入后给一个空格,但它只是给了空格。知道为什么吗?
  • @TheNoob 在@Arya Stark@Robb Stark 之前有一个景观,如果这就是您要问的。截图看不清楚。
【解决方案2】:

您可能没有等待足够长的时间来完成粘贴。你粘贴得非常快三遍。如果开始粘贴需要一段时间,它可能会在您将最后一个内容放入剪贴板之后开始粘贴。

如果是这种情况,一个简单的解决方案是用所有行填充剪贴板,然后将其粘贴(假设 Scanner 输入不是很大,会填满你的所有内存)。

你可以使用这样的代码(记得import java.awt.datatransfer.StringSelection):

TimeUnit.MINUTES.sleep(1);

final Scanner scanner = new Scanner(br);
final StringBuilder sb = new StringBuilder();
while (scanner.hasNextLine()) {
    sb.append('@');
    sb.append(scanner.getLine());
    sb.append('\n');
    sb.append(' ');
}

final StringSelection text = new StringSelection(sb.toString());
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(text, text);

final Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);

您的代码中的一些小问题,忽略了上面的潜在解决方案:

  • 如果您不更改任何其他内容,您的循环条件可能应该只是true,因为nextLine() 永远不会返回null(它使用异常代替),那么scan 将如何成为null ?
  • 您应该使用hasNextLine() 而不是hasNext()(每个next…() 方法都有一个hasNext…() 方法,您应该匹配它们)。 hasNext() 检查是否存在下一个令牌,而不是下一行。

【讨论】:

  • T Rex,我实际上是想单独复制名称。我的意思是,扫描仪会单独扫描每个名字,机器人也会单独输入。解决方案已在下一条评论中给出。无论如何谢谢:D
猜你喜欢
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 2016-12-20
  • 2017-02-15
  • 2019-08-29
相关资源
最近更新 更多