Sao chép văn bản vào clipboard bằng Java


139

Tôi muốn sao chép văn bản từ một JTableô vào bảng tạm, để nó có thể được dán vào các chương trình khác như Microsoft Word. Tôi có văn bản từ JTable, nhưng tôi không chắc làm thế nào để sao chép nó vào clipboard.

Câu trả lời:


270

Điều này làm việc cho tôi và khá đơn giản:

Nhập những thứ này:

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

Và sau đó đặt đoạn mã này bất cứ nơi nào bạn muốn thay đổi bảng tạm:

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

1
chúng ta có thể thiết lậpContents () với chủ sở hữu quá stackoverflow.com/questions/3591945/ cấp
Aquarius Power

@AquariusPower Có vẻ như việc chuyển stringSelectionthành đối số thứ 2 setContents(..)cũng vậy, làm cho nó ClipboardOwner, như trong câu trả lời được liên kết, không có ý nghĩa gì: nhìn vào nguồn , phương thức duy nhất ClipboardOwnermà nó thực hiện, cụ thể là, lostOwnership(..)trống rỗng. Vì vậy, đối số thứ 2 dường như là một cuộc gọi lại hoàn toàn tùy chọn.
Evgeni Sergeev

@EvgeniSergeev nó có thể hữu ích nếu chúng tôi mở rộng StringSelection :)
Sức mạnh của Bảo Bình vào

1
Chuyển đến Clojure:(-> (java.awt.Toolkit/getDefaultToolkit) .getSystemClipboard (.setContents (java.awt.datatransfer.StringSelection. "test") nil))
NikoNyrh

Trong bối cảnh nào bạn đã kiểm tra điều này? Từ một ứng dụng GUI? Trên nền tảng nào? Nó có hoạt động thiết lập bảng tạm 100 lần liên tiếp (với một số tạm dừng thích hợp giữa mỗi bộ) không?
Peter Mortensen

18

Đây là câu trả lời được chấp nhận được viết theo cách trang trí:

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

18

Lớp sau cho phép bạn sao chép / dán Chuỗi vào / từ bảng ghi tạm.

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
Có thể cần một số logic để dán trong OS X vì nó đặc biệt.
Ben Leggiero 29/07/2015

1
@BenLeggiero: Trả lời muộn nhưng hãy đề nghị chỉnh sửa để hỗ trợ OS Xtốt hơn trong trường hợp nó không hoạt động đúng
BullyWiiPlaza

1
nếu tôi cần làm điều này một lần nữa, tôi sẽ cập nhật. Có khả năng, nó chỉ kiểm tra HĐH hiện tại và đổi VK_CONTROLchỗ VK_METAnếu là macOS.
Ben Leggiero

Đây là những gì tôi cần nó.
5377037

2

Tôi đã tìm thấy một cách tốt hơn để làm điều đó để bạn có thể nhận được đầu vào từ một txtbox hoặc có một cái gì đó được tạo trong hộp văn bản đó và có thể nhấp vào một nút để làm điều đó.!

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
Bạn có ý nghĩa gì với "2017/2018"? Một phiên bản cụ thể của Java? Bạn đã sử dụng phiên bản nào ?
Peter Mortensen

1

Đối với các ứng dụng dựa trên 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 có thể lưu nhiều dữ liệu ở một số định dạng dữ liệu như (html, url, văn bản thuần túy, hình ảnh).

Để biết thêm thông tin xem tài liệu chính thức

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.