首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有一种方法可以在动态更改剪贴板内容的同时在Java端复制和粘贴?

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

Stack Overflow用户
提问于 2014-10-22 15:34:23
回答 1查看 659关注 0票数 1

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

应用程序的外观在某种程度上等同于excel,您可以使用Tab键进入下一列,使用enter键进入下一行。下面的代码应该读取剪贴板内容并立即粘贴字符串。为了做到这一点,我结合使用了Key Robot和剪贴板的设置。现在我遇到了以下问题。我为Excel工作表中的每个单元格在循环中设置了新的剪贴板内容。我使用以下命令获取每个单元格的单个值

getClipboardContents,但是按下ctrl +v的机器人仍然会复制要复制到Excel中的整个区域。有没有一种方法可以在动态更改剪贴板内容的同时在Java端复制和粘贴?

代码语言:javascript
运行
复制
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());
}
EN

Stack Overflow用户

发布于 2014-10-22 16:14:27

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

代码语言:javascript
运行
复制
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();
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26502379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档