Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以在动态更改剪贴板内容的同时在Java端进行复制和粘贴?_Java - Fatal编程技术网

有没有一种方法可以在动态更改剪贴板内容的同时在Java端进行复制和粘贴?

有没有一种方法可以在动态更改剪贴板内容的同时在Java端进行复制和粘贴?,java,Java,我正在尝试将Excel复制并粘贴到我们自己的应用程序中的几个字段中。 为此,我读取剪贴板并创建一个数组,该数组等于从excel复制的字段 应用程序的外观在某种程度上与excel相同,您可以使用tab进入下一列,使用enter进入下一行。下面的代码应该读取剪贴板内容并立即粘贴字符串。要做到这一点,我使用的关键机器人与剪贴板的设置相结合。现在我遇到了以下问题。我为Excel工作表中的每个单元格在循环中设置新的剪贴板内容。我得到的是每个单元格的单个值 getClipboardContents,但机器人

我正在尝试将Excel复制并粘贴到我们自己的应用程序中的几个字段中。 为此,我读取剪贴板并创建一个数组,该数组等于从excel复制的字段

应用程序的外观在某种程度上与excel相同,您可以使用tab进入下一列,使用enter进入下一行。下面的代码应该读取剪贴板内容并立即粘贴字符串。要做到这一点,我使用的关键机器人与剪贴板的设置相结合。现在我遇到了以下问题。我为Excel工作表中的每个单元格在循环中设置新的剪贴板内容。我得到的是每个单元格的单个值 getClipboardContents,但机器人按ctrl+v仍会复制Excel中复制的整个区域。有没有一种方法可以在动态更改剪贴板内容的同时在Java端进行复制和粘贴

private String getClipboardContents() {
    String result = "";
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    // odd: the Object param of getContents is not currently used
    Transferable contents = clipboard.getContents(null);
    boolean hasTransferableText = (contents != null) && contents.isDataFlavorSupported(DataFlavor.stringFlavor);
    if (hasTransferableText) {
        try {
            result = (String) contents.getTransferData(DataFlavor.stringFlavor);
        } catch (UnsupportedFlavorException ex) {
            // highly unlikely since we are using a standard DataFlavor
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (NullPointerException npe) {
            npe.printStackTrace();
        }
    }
    return result;
}

private String[][] generateExcelArray() {
    String clipboard = getClipboardContents();
    String[] rows = clipboard.split("\n");
    String[][] table = new String[rows.length][rows[0].split("\t").length];
    for (int i = 0; i < table.length; ++i) {
        String[] row = rows[i].split("\t");
        int _a = 0;
        if (row.length != table[i].length) 
            _a = table[i].length - row.length;
        for (int j = 0; j+_a < table[i].length; ++j) {
            String cell = row[j];
            table[i][j+_a] = cell;
        }
    }
    return table;
}

private void fillFields() throws AWTException {
    String[][] excelTable = generateExcelArray();
    Robot keySender = new Robot();
    String bufferCopy = getClipboardContents();
    for (int i = 0; i < excelTable.length; ++i) {
        for (int j = 0; j < excelTable[i].length; ++j) {
            setClipboard(excelTable[i][j]);
            keySender.keyPress(KeyEvent.VK_CONTROL);
            keySender.keyPress(KeyEvent.VK_V);
            keySender.keyRelease(KeyEvent.VK_CONTROL);
            keySender.keyRelease(KeyEvent.VK_V);
            keySender.keyPress(KeyEvent.VK_TAB);
            keySender.keyRelease(KeyEvent.VK_TAB);
        }
        keySender.keyPress(KeyEvent.VK_ENTER);
        keySender.keyRelease(KeyEvent.VK_ENTER);
    }
    setClipboard(bufferCopy);
}

private void setClipboard(String input) {
    StringSelection selection = new StringSelection(input);
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    clipboard.setContents(selection, selection);
    System.out.println(getClipboardContents());
}

经过几次测试后,我发现,it确实能够在内部识别更改,但windows无法识别。 将粘贴过程设置为线程,延迟5毫秒就足以让windows执行剪贴板更改

final String[][] excelTable = generateExcelArray();
    final Robot keySender = new Robot();
    final String bufferCopy = getClipboardContents();
    final int delay = 5;
    new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < excelTable.length; ++i) {
                for (int j = 0; j < excelTable[i].length; ++j) {
                    setClipboard(excelTable[i][j] == null ? "":excelTable[i][j]);
                    try {
                        Thread.sleep(delay);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    keySender.keyPress(KeyEvent.VK_CONTROL);
                    keySender.keyPress(KeyEvent.VK_V);
                    keySender.keyRelease(KeyEvent.VK_CONTROL);
                    keySender.keyRelease(KeyEvent.VK_V);
                    try {
                        Thread.sleep(delay);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    keySender.keyPress(KeyEvent.VK_TAB);
                    keySender.keyRelease(KeyEvent.VK_TAB);
                }
                try {
                    Thread.sleep(delay);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                keySender.keyPress(KeyEvent.VK_ENTER);
                keySender.keyRelease(KeyEvent.VK_ENTER);
            }
            try {
                Thread.sleep(delay);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            setClipboard(bufferCopy);
        }
    }).start();

查看nio包中的缓冲区类。可能有用的方法可以是翻转和紧凑。