使用Java将文本复制到剪贴板

使用Java将文本复制到剪贴板,java,swing,text,clipboard,Java,Swing,Text,Clipboard,我想将JTable单元格中的文本复制到剪贴板,以便粘贴到其他程序(如Microsoft Word)中。我有JTable中的文本,但我不确定如何将其复制到剪贴板。这对我来说很有效,非常简单: import java.awt.*; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import s

我想将
JTable
单元格中的文本复制到剪贴板,以便粘贴到其他程序(如Microsoft Word)中。我有
JTable
中的文本,但我不确定如何将其复制到剪贴板。

这对我来说很有效,非常简单:

import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;

import static java.awt.event.KeyEvent.*;
import static org.apache.commons.lang3.SystemUtils.IS_OS_MAC;

public class SystemClipboard
{
    public static void copy(String text)
    {
        Clipboard clipboard = getSystemClipboard();
        clipboard.setContents(new StringSelection(text), null);
    }

    public static void paste() throws AWTException
    {
        Robot robot = new Robot();

        int controlKey = IS_OS_MAC ? VK_META : VK_CONTROL;
        robot.keyPress(controlKey);
        robot.keyPress(VK_V);
        robot.keyRelease(controlKey);
        robot.keyRelease(VK_V);
    }

    public static String get() throws Exception
    {
        Clipboard systemClipboard = getSystemClipboard();
        DataFlavor dataFlavor = DataFlavor.stringFlavor;

        if (systemClipboard.isDataFlavorAvailable(dataFlavor))
        {
            Object text = systemClipboard.getData(dataFlavor);
            return (String) text;
        }

        return null;
    }

    private static Clipboard getSystemClipboard()
    {
        Toolkit defaultToolkit = Toolkit.getDefaultToolkit();
        return defaultToolkit.getSystemClipboard();
    }
}
导入这些:

import java.awt.datatransfer.StringSelection;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
然后将这段代码放在您希望更改剪贴板的任何位置:

String myString = "This text will be copied into clipboard";
StringSelection stringSelection = new StringSelection(myString);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, null);

下面的类允许您在剪贴板中复制/粘贴字符串

import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;

import static java.awt.event.KeyEvent.*;
import static org.apache.commons.lang3.SystemUtils.IS_OS_MAC;

public class SystemClipboard
{
    public static void copy(String text)
    {
        Clipboard clipboard = getSystemClipboard();
        clipboard.setContents(new StringSelection(text), null);
    }

    public static void paste() throws AWTException
    {
        Robot robot = new Robot();

        int controlKey = IS_OS_MAC ? VK_META : VK_CONTROL;
        robot.keyPress(controlKey);
        robot.keyPress(VK_V);
        robot.keyRelease(controlKey);
        robot.keyRelease(VK_V);
    }

    public static String get() throws Exception
    {
        Clipboard systemClipboard = getSystemClipboard();
        DataFlavor dataFlavor = DataFlavor.stringFlavor;

        if (systemClipboard.isDataFlavorAvailable(dataFlavor))
        {
            Object text = systemClipboard.getData(dataFlavor);
            return (String) text;
        }

        return null;
    }

    private static Clipboard getSystemClipboard()
    {
        Toolkit defaultToolkit = Toolkit.getDefaultToolkit();
        return defaultToolkit.getSystemClipboard();
    }
}

这是以装饰性的方式书写的公认答案:

Toolkit.getDefaultToolkit()
        .getSystemClipboard()
        .setContents(
                new StringSelection(txtMySQLScript.getText()),
                null
        );

我找到了一个更好的方法,这样你就可以从txtbox中获取输入,或者在文本框中生成一些内容,然后点击按钮来完成它

import java.awt.datatransfer.*;
import java.awt.Toolkit;

private void /* Action performed when the copy to clipboard button is clicked */ {
    String ctc = txtCommand.getText().toString();
    StringSelection stringSelection = new StringSelection(ctc);
    Clipboard clpbrd = Toolkit.getDefaultToolkit().getSystemClipboard();
    clpbrd.setContents(stringSelection, null);
}

// txtCommand is the variable of a text box

用于基于JavaFx的应用程序

//返回系统剪贴板
最终剪贴板=Clipboard.getSystemClipboard();
//ClipboardContent提供了以不同格式存储数据的灵活性
最终剪贴簿内容=新剪贴簿内容();
content.putString(“一些文本”);
content.putHtml(“一些文本”);
//这将被以前的putString替换
content.putString(“一些不同的文本”);
//将内容设置为剪贴板
剪贴板。设置内容(content);
//在检索之前进行验证
if(clipboard.hasContent(DataFormat.HTML)){
System.out.println(clipboard.getHtml());
}
if(clipboard.hastring()){
System.out.println(clipboard.getString());
}
剪贴簿内容可以以多种数据格式保存多个数据,如(html、url、纯文本、图像)


有关更多信息,请参见

可能需要一些逻辑才能粘贴到OS X中,因为它很特殊。@BenLeggiero:回答晚了,但请随时建议编辑以更好地支持
OS X
,以防它无法正常工作。如果我需要再次执行此操作,我将进行更新。很可能,它只是检查当前的操作系统,并将
VK_控件
替换为
VK_META
(如果是macOS)。这就是我所需要的。我们可以将setContents()与owner too@AquariusPower一起设置,
stringSelection
似乎也将
setContents(…)
作为第二个参数传递给
setContents(…)
,使其成为
ClipboardOwner
,正如在链接的答案中一样,没有任何意义:查看,它实现的
ClipboardOwner
的唯一方法,即
lostOwnership(…)
,是空的。因此,第二个参数似乎是一个完全可选的回调。@evgeniservev如果我们将StringSelection:)扩展到Clojure:
(>(java.awt.Toolkit/getDefaultToolkit.getSystemClipboard(.setContents(java.awt.datatransfer.StringSelection.test)nil))
您是在哪个上下文中测试这个的?从GUI应用程序?在哪个站台?连续100次设置剪贴板(每组之间有适当的停顿)有效吗?你说的“2017/2018”是什么意思?Java的特定版本?你用的是哪个版本?