[英]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.