Робот печатает одну и ту же строку снова и снова - PullRequest
0 голосов
/ 08 октября 2018

Итак, я пишу код, в котором у меня есть текстовый файл, и у меня есть три имени в трех отдельных строках.После запуска кода я открываю MS Word, приложение помещается с 1-минутной задержкой.Затем код должен распечатать все имена из моего файла в MS Word.

Но вместо этого мой код просто печатает фамилию в моем текстовом файле три раза.Теперь я напечатал имена в своей 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;
            }
        }

Так что мой текстовый файл похож на

  Ned Stark
  Arya Stark
  Robb Stark

, и, несмотря на то, что я набираю все эти имена, набирается следующее

   @Robb Stark
   @Robb Stark
   @Robb Stark

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Добавление еще одной 1-секундной задержки внутри цикла while решит вашу проблему.

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

enter image description here

0 голосов
/ 08 октября 2018

Вы, вероятно, не дожидаетесь завершения пасты.Вы вставляете очень быстро три раза.Если для вставки требуется некоторое время, оно может начать вставлять после того, как вы поместите последнюю вещь в буфер обмена.

Если это так, простое решение - заполнить буфер обмена всемистроки, а затем вставить это (это предполагает, что ввод 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() (естьhasNext…() метод для каждого next…() метода, и вы должны сопоставить их).hasNext() проверяет наличие следующего токена, а не наличие следующей строки.
...