Menyalin teks ke clipboard menggunakan Java

149

Saya ingin menyalin teks dari JTablesel a ke clipboard, membuatnya tersedia untuk disisipkan ke program lain seperti Microsoft Word. Saya memiliki teks dari JTable, tetapi saya tidak yakin bagaimana cara menyalinnya ke clipboard.

pengguna765134
sumber

Jawaban:

285

Ini bekerja untuk saya dan cukup sederhana:

Impor ini:

import java.awt.datatransfer.StringSelection;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;

Dan kemudian letakkan cuplikan kode ini di mana pun Anda ingin mengubah papan klip:

String myString = "This text will be copied into clipboard";
StringSelection stringSelection = new StringSelection(myString);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, null);
LouwHopley
sumber
1
kita bisa setContents () dengan pemilik juga stackoverflow.com/questions/3591945/…
Aquarius Power
@AquariusPower Tampaknya meneruskan stringSelectionsebagai argumen ke-2 setContents(..)juga, menjadikannya ClipboardOwner, seperti dalam jawaban terkait, tidak memiliki signifikansi: melihat sumbernya , satu-satunya metode ClipboardOwneryang diimplementasikannya, yaitu, lostOwnership(..)kosong. Jadi, argumen ke-2 tampaknya menjadi callback yang sepenuhnya opsional.
Evgeni Sergeev
@EvgeniSergeev mungkin berguna jika kami memperpanjang StringSelection :)
Aquarius Power
1
Diangkut ke Clojure:(-> (java.awt.Toolkit/getDefaultToolkit) .getSystemClipboard (.setContents (java.awt.datatransfer.StringSelection. "test") nil))
NikoNyrh
Dalam konteks apa Anda menguji ini? Dari aplikasi GUI? Di platform mana? Apakah ini berfungsi mengatur clipboard 100 kali berturut-turut (dengan jeda yang sesuai di antara setiap set)?
Peter Morten
21

Kelas berikut memungkinkan Anda untuk menyalin / menempelkan String ke / dari papan klip.

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();
    }
}
BullyWiiPlaza
sumber
1
Mungkin perlu beberapa logika untuk menempelkan di OS X karena ini spesial.
Ben Leggiero
1
@BenLeggiero: Jawaban terlambat tetapi jangan ragu untuk menyarankan pengeditan untuk mendukung OS Xlebih baik jika tidak berfungsi dengan benar
BullyWiiPlaza
1
jika saya perlu melakukan ini lagi, saya akan memperbarui. Kemungkinan besar, itu hanya memeriksa OS saat ini, dan menukar VK_CONTROLuntuk VK_METAapakah itu MacOS.
Ben Leggiero
Inilah yang saya butuhkan.
5377037
20

Ini adalah jawaban yang diterima yang ditulis dengan cara dekoratif:

Toolkit.getDefaultToolkit()
        .getSystemClipboard()
        .setContents(
                new StringSelection(txtMySQLScript.getText()),
                null
        );
Wesos de Queso
sumber
4

Untuk aplikasi berbasis 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 dapat menyimpan banyak data dalam beberapa format data seperti (html, url, teks biasa, gambar).

Untuk informasi lebih lanjut lihat dokumentasi resmi

prasadg
sumber
2

Saya menemukan cara yang lebih baik untuk melakukannya sehingga Anda bisa mendapatkan masukan dari txtbox atau membuat sesuatu dibuat di kotak teks itu dan dapat mengklik tombol untuk melakukannya.!

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
ElementCodez
sumber
1
Apa yang Anda maksud dengan "2017/2018"? Versi Java tertentu? Versi yang tidak Anda gunakan?
Peter Mortensen