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


139

我想将文本从JTable的单元格复制到剪贴板,以使其可以粘贴到其他程序中,例如Microsoft Word。我有来自的文本JTable,但不确定如何将其复制到剪贴板。

Answers:


270

这对我有用,非常简单:

导入这些:

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

1
我们可以setContents()与所有者太stackoverflow.com/questions/3591945/...
水瓶座电

@AquariusPower似乎也stringSelection作为第二个参数传递给setContents(..)ClipboardOwner,就像在链接的答案中一样,没有任何意义:观察sourceClipboardOwner它实现的唯一方法lostOwnership(..)是空的。因此,第二个参数似乎是一个完全可选的回调。
Evgeni Sergeev

@EvgeniSergeev,如果我们扩展StringSelection :)可能会很有用:
Aquarius Power

1
移植到Clojure:(-> (java.awt.Toolkit/getDefaultToolkit) .getSystemClipboard (.setContents (java.awt.datatransfer.StringSelection. "test") nil))
NikoNyrh '17

您在哪种情况下对此进行了测试?从GUI应用程序?在哪个平台上?连续设置剪贴板100次是否有效(每组之间有适当的暂停时间)?
彼得·莫滕森

18

这是装饰性的公认答案:

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

18

下列类使您可以从剪贴板复制/粘贴字符串。

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

1
由于特殊,可能需要一些逻辑才能粘贴到OS X中。
Ben Leggiero 2015年

1
@BenLeggiero:答案较晚,但OS X可以在不正常工作的情况下建议进行修改以提供更好的支持
BullyWiiPlaza

1
如果我需要再次执行此操作,我会更新。有可能的,它只是检查当前的操作系统,并换出VK_CONTROLVK_META,如果它是Mac系统。
Ben Leggiero

这就是我所需要的。
5377037,

2

我发现了一种更好的方法,因此您可以从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

1
“ 2017/2018”是什么意思?Java的特定版本?哪个版本没有你呢?
彼得·莫滕森

1

对于基于JavaFx的应用程序。

        //returns System Clipboard
        final Clipboard clipboard = Clipboard.getSystemClipboard();
        // ClipboardContent provides flexibility to store data in different formats
        final ClipboardContent content = new ClipboardContent();
        content.putString("Some text");
        content.putHtml("<b>Some</b> text");
        //this will be replaced by previous putString
        content.putString("Some different text");
        //set the content to clipboard
        clipboard.setContent(content);
       // validate before retrieving it
        if(clipboard.hasContent(DataFormat.HTML)){
            System.out.println(clipboard.getHtml());
        }
        if(clipboard.hasString()){
            System.out.println(clipboard.getString());
        }

ClipboardContent可以以多种数据格式(例如,html,url,纯文本,图像)保存多个数据。

有关更多信息,请参见官方文档

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.