机器人一遍又一遍地打印相同的字符串
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
并不想输入所有这些名称,正在输入以下内容
@Robb Stark
@Robb Stark
@Robb Stark
您可能等待粘贴完成的时间不够长。你贴得真快三遍。如果开始粘贴需要一段时间,它可能会在您将最后一个内容放入剪贴板后 开始粘贴。
如果是这种情况,一个简单的解决方案是用所有行填充剪贴板,然后粘贴(假设 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()
永远不会 returns null
(它使用异常代替) ,那么 scan
将如何成为 null
?
- 您应该使用
hasNextLine()
而不是 hasNext()
(每个 next…()
方法都有一个 hasNext…()
方法,您应该将它们匹配起来)。 hasNext()
检查是否存在下一个标记,而不是下一行。
在 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);
}
所以我正在编写一个代码,其中有一个 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
并不想输入所有这些名称,正在输入以下内容
@Robb Stark
@Robb Stark
@Robb Stark
您可能等待粘贴完成的时间不够长。你贴得真快三遍。如果开始粘贴需要一段时间,它可能会在您将最后一个内容放入剪贴板后 开始粘贴。
如果是这种情况,一个简单的解决方案是用所有行填充剪贴板,然后粘贴(假设 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()
永远不会 returnsnull
(它使用异常代替) ,那么scan
将如何成为null
? - 您应该使用
hasNextLine()
而不是hasNext()
(每个next…()
方法都有一个hasNext…()
方法,您应该将它们匹配起来)。hasNext()
检查是否存在下一个标记,而不是下一行。
在 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);
}