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

189

我想将一个 JTable 的单元格中的文本复制到剪贴板,以便可以将其粘贴到其他程序中,如 Microsoft Word。我已经获取了 JTable 中的文本,但不确定如何将其复制到剪贴板。

7个回答

344

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

导入这些内容:

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
我们可以使用所有者(owner)一起设置setContents()方法。https://dev59.com/bHA65IYBdhLWcg3w2yo2 - Aquarius Power
@AquariusPower 看起来将 stringSelection 作为第二个参数传递给 setContents(..),并将其作为 ClipboardOwner,就像链接中的答案一样,没有任何意义:查看 源代码,它实现的 ClipboardOwner 的唯一方法,即 lostOwnership(..),是空的。因此,第二个参数似乎是一个完全可选的回调。 - Evgeni Sergeev
@EvgeniSergeev 如果我们扩展StringSelection会很有用 :) - Aquarius Power
3
移植到Clojure:(-> (java.awt.Toolkit/getDefaultToolkit) .getSystemClipboard (.setContents (java.awt.datatransfer.StringSelection. "test") nil)) - NikoNyrh
你是在什么情况下测试的?是从GUI应用程序吗?在哪个平台上?如果连续设置剪贴板100次(每次设置之间适当暂停),它是否有效? - Peter Mortensen

34

这是一个以华丽风格书写的被接受的答案:

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

21

以下类允许您将字符串复制/粘贴到/从剪贴板中。

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中粘贴,因为它很特殊。 - Ky -
1
@BenLeggiero:回答晚了,但如果OS X不能正常工作,请随时建议编辑以提供更好的支持。 - BullyWiiPlaza
1
如果我将来需要再次执行此操作,我会进行更新。很可能只是检查当前的操作系统,并在macOS上将VK_CONTROL替换为VK_META - Ky -
这就是我需要的。 - user1773603

9

针对基于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、纯文本和图像)的多个数据。

更多信息请参见官方文档


3

供参考:

static void copyToClipboard(String text) {
    java.awt.Toolkit.getDefaultToolkit().getSystemClipboard()
        .setContents(new java.awt.datatransfer.StringSelection(text), null);
}

3

我发现一种更好的方法,可以从文本框中获取输入或生成某些内容,并能够单击按钮执行它。

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的特定版本吗?你用的是哪个版本? - Peter Mortensen

-1

为了参考,这里是使用Clojure(与Java相关)编写的系统剪贴板copypaste函数:


(defn copy [s]
  (-> (java.awt.Toolkit/getDefaultToolkit)
      .getSystemClipboard
      (.setContents (java.awt.datatransfer.StringSelection. s) nil)))

(defn paste []
  (-> (java.awt.Toolkit/getDefaultToolkit)
      .getSystemClipboard
      (.getContents nil)
      (.getTransferData java.awt.datatransfer.DataFlavor/stringFlavor)))

(copy "Hello!")
(paste) ;=> "Hello!"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接