Kopiowanie tekstu do schowka za pomocą języka Java

139

Chcę skopiować tekst z JTablekomórki do schowka, umożliwiając wklejenie go do innych programów, takich jak Microsoft Word. Mam tekst z folderu JTable, ale nie wiem, jak skopiować go do schowka.

user765134
źródło

Odpowiedzi:

270

To działa dla mnie i jest dość proste:

Importuj te:

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

Następnie umieść ten fragment kodu w dowolnym miejscu, w którym chcesz zmienić schowek:

String myString = "This text will be copied into clipboard";
StringSelection stringSelection = new StringSelection(myString);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, null);
LouwHopley
źródło
1
możemy ustawićContents () z właścicielem też stackoverflow.com/questions/3591945/…
Aquarius Power
@AquariusPower Wydaje się, że przekazanie stringSelectionjako drugiego argumentu setContents(..)również, czyniąc go ClipboardOwner, jak w powiązanej odpowiedzi, nie ma żadnego znaczenia: patrząc na źródło , jedyna metoda ClipboardOwner, którą implementuje lostOwnership(..), jest pusta. Zatem drugi argument wydaje się być całkowicie opcjonalnym wywołaniem zwrotnym.
Evgeni Sergeev
@EvgeniSergeev może się przydać, jeśli przedłużymy StringSelection :)
Aquarius Power
1
Przeniesiono do Clojure:(-> (java.awt.Toolkit/getDefaultToolkit) .getSystemClipboard (.setContents (java.awt.datatransfer.StringSelection. "test") nil))
NikoNyrh
W jakim kontekście to przetestowałeś? Z aplikacji GUI? Na jakiej platformie? Czy działa ustawianie schowka 100 razy z rzędu (z odpowiednią przerwą między każdym zestawem)?
Peter Mortensen
18

Oto akceptowana odpowiedź napisana w ozdobny sposób:

Toolkit.getDefaultToolkit()
        .getSystemClipboard()
        .setContents(
                new StringSelection(txtMySQLScript.getText()),
                null
        );
Wesos de Queso
źródło
18

Poniższa klasa umożliwia kopiowanie / wklejanie ciągu znaków do / ze schowka.

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
źródło
1
Może potrzebować logiki do wklejenia w OS X, ponieważ jest wyjątkowy.
Ben Leggiero
1
@BenLeggiero: Spóźniona odpowiedź, ale nie wahaj się zasugerować zmiany w celu OS Xlepszego wsparcia, jeśli nie działa poprawnie
BullyWiiPlaza
1
jeśli kiedykolwiek będę musiał to zrobić ponownie, zaktualizuję. Prawdopodobnie to właśnie sprawdzania aktualnego systemu operacyjnego i wymieniając VK_CONTROLna VK_METArazie to MacOS.
Ben Leggiero
Właśnie tego potrzebuję.
5377037
2

Znalazłem lepszy sposób na zrobienie tego, abyś mógł uzyskać dane wejściowe z txtbox lub wygenerować coś w tym polu tekstowym i móc kliknąć przycisk, aby to zrobić.!

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
źródło
1
Co masz na myśli mówiąc „2017/2018”? Określona wersja Java? Która wersja nie używasz?
Peter Mortensen
1

Do aplikacji opartych na 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 może zapisywać wiele danych w kilku formatach danych, takich jak (html, adres URL, zwykły tekst, obraz).

Więcej informacji można znaleźć w oficjalnej dokumentacji

prasadg
źródło