คัดลอกข้อความไปยังคลิปบอร์ดโดยใช้ Java


139

ฉันต้องการคัดลอกข้อความจากJTableเซลล์ไปยังคลิปบอร์ดทำให้สามารถวางลงในโปรแกรมอื่นเช่น Microsoft Word ฉันได้รับข้อความจากJTableแต่ฉันไม่แน่ใจว่าจะคัดลอกไปยังคลิปบอร์ดได้อย่างไร

คำตอบ:


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//
Aquarius Power

@ AquariusPower ดูเหมือนว่าการผ่านstringSelectionเป็นอาร์กิวเมนต์ที่ 2 ไปsetContents(..)ด้วยทำให้ClipboardOwnerเป็นเช่นเดียวกับในคำตอบที่เชื่อมโยงไม่มีความสำคัญ: ดูที่แหล่งที่มาวิธีการเพียงอย่างเดียวของClipboardOwnerที่มันดำเนินการคือlostOwnership(..)ว่างเปล่า ดังนั้นข้อโต้แย้งที่ 2 น่าจะเป็นการเรียกกลับที่ไม่จำเป็นทั้งหมด
Evgeni Sergeev

@EvgeniSergeev มันอาจจะมีประโยชน์ถ้าเราขยาย StringSelection :)
Aquarius Power

1
ส่งไปยัง Clojure:(-> (java.awt.Toolkit/getDefaultToolkit) .getSystemClipboard (.setContents (java.awt.datatransfer.StringSelection. "test") nil))
NikoNyrh

คุณทดสอบสิ่งนี้ในบริบทใด จากแอปพลิเคชัน GUI หรือไม่ บนแพลตฟอร์มใด ใช้งานการตั้งค่าคลิปบอร์ด 100 ครั้งในหนึ่งแถว (หยุดชั่วคราวที่เหมาะสมระหว่างแต่ละชุด) หรือไม่
Peter Mortensen

18

นี่คือคำตอบที่ได้รับการยอมรับในรูปแบบการตกแต่ง:

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

18

คลาสต่อไปนี้อนุญาตให้คุณคัดลอก / วาง String ไปยัง / จากคลิปบอร์ด

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

1
@BenLeggiero: ตอบช้า แต่อย่าลังเลที่จะแนะนำการแก้ไขเพื่อสนับสนุนที่OS Xดีกว่าในกรณีที่มันไม่ทำงานอย่างถูกต้อง
BullyWiiPlaza

1
ถ้าฉันต้องทำสิ่งนี้อีกครั้งฉันจะอัปเดต น่าจะเป็นเพียงการตรวจสอบระบบปฏิบัติการปัจจุบันและสลับVK_CONTROLสำหรับVK_METAถ้ามัน MacOS
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 รุ่นใดรุ่นหนึ่ง? รุ่นที่ไม่ให้คุณใช้?
Peter Mortensen

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, ข้อความธรรมดา, รูปภาพ)

สำหรับข้อมูลเพิ่มเติมดูเอกสารทางการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.