簡體   English   中英

機械手一次又一次地打印相同的字符串

[英]Robot is printing the same string over and over again

因此,我正在編寫代碼,其中有一個txt文件,並且在其中的三個單獨行中有三個名稱。 運行代碼后,我打開MS Word,該應用程序延遲了1分鍾。 然后,該代碼應該將我文件中的所有名稱打印到MS Word中。

但是我的代碼在做什么,它只是將txt文件中的姓氏打印了三次。 現在,我已經使用System.out.println()在我的IDE中打印了名稱,並且所有名稱都已被打印。 問題是當機器人在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

並鍵入所有這些名稱,則鍵入了Followig

   @Robb Stark
   @Robb Stark
   @Robb Stark

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

在此處輸入圖片說明

您可能等待的時間不夠長,無法完成粘貼。 您很快就粘貼了三遍。 如果需要一段時間才能開始粘貼,則將最后一件東西放入剪貼板可能會開始粘貼。

在這種情況下,一個簡單的解決方案是在剪貼板中填滿所有行,然后粘貼(假設“ 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…() next…()方法,並且應該將它們匹配)。 hasNext()檢查下一個標記的存在,而不是下一行的存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM