Kopieren von Text in die Zwischenablage mit Java


139

Ich möchte Text aus einer JTableZelle in die Zwischenablage kopieren , damit er in andere Programme wie Microsoft Word eingefügt werden kann. Ich habe den Text aus dem JTable, bin mir aber nicht sicher, wie ich ihn in die Zwischenablage kopieren soll.

Antworten:


270

Das funktioniert bei mir und ist ganz einfach:

Importieren Sie diese:

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

Und platzieren Sie diesen Codeausschnitt an einer beliebigen Stelle, an der Sie die Zwischenablage ändern möchten:

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

1
Wir können Inhalte () auch mit dem Eigentümer setzen. stackoverflow.com/questions/3591945/…
Aquarius Power

@AquariusPower Es scheint , dass es keine Bedeutung hat, als zweites stringSelectionArgument setContents(..)zu übergeben, es ClipboardOwnerwie in der verknüpften Antwort zu machen: Wenn man die Quelle betrachtet , ist die einzige Methode ClipboardOwner, die es implementiert, nämlich lostOwnership(..)leer. Das zweite Argument scheint also ein völlig optionaler Rückruf zu sein.
Evgeni Sergeev

@ EvgeniSergeev es kann nützlich sein, wenn wir StringSelection erweitern :)
Aquarius Power

1
Portiert nach Clojure:(-> (java.awt.Toolkit/getDefaultToolkit) .getSystemClipboard (.setContents (java.awt.datatransfer.StringSelection. "test") nil))
NikoNyrh

In welchem ​​Kontext haben Sie das getestet? Aus einer GUI-Anwendung? Auf welcher Plattform? Funktioniert es, die Zwischenablage 100 Mal hintereinander einzustellen (mit einer entsprechenden Pause zwischen den einzelnen Sätzen)?
Peter Mortensen

18

Dies ist die akzeptierte Antwort, die auf dekorative Weise geschrieben wurde:

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

18

Mit der folgenden Klasse können Sie einen String in die / aus der Zwischenablage kopieren / einfügen.

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
Möglicherweise ist eine Logik zum Einfügen in OS X erforderlich, da dies etwas Besonderes ist.
Ben Leggiero

1
@ BenLeggiero: Späte Antwort, aber OS XSie können
gerne

1
Wenn ich das jemals wieder tun muss, werde ich aktualisieren. Wahrscheinlich, es überprüft nur die aktuellen OS und Auslagern VK_CONTROLfür VK_METAwenn es macOS ist.
Ben Leggiero

Das brauche ich.
5377037

2

Ich habe einen besseren Weg gefunden, dies zu tun, damit Sie eine Eingabe von einer txtbox erhalten oder etwas in diesem Textfeld generieren lassen und auf eine Schaltfläche klicken können, um dies zu tun.!

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
Was meinst du mit "2017/2018"? Eine bestimmte Version von Java? Welche Version hast du benutzt?
Peter Mortensen

1

Für JavaFx- basierte Anwendungen.

        //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 kann mehrere Daten in verschiedenen Datenformaten wie (HTML, URL, Klartext, Bild) speichern.

Weitere Informationen finden Sie in der offiziellen Dokumentation

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.