Copie de texte dans le presse-papiers à l'aide de Java

139

Je souhaite copier le texte d'une JTablecellule dans le presse-papiers, le rendant disponible pour être collé dans d'autres programmes tels que Microsoft Word. J'ai le texte du JTable, mais je ne sais pas comment le copier dans le presse-papiers.

user765134
la source

Réponses:

270

Cela fonctionne pour moi et est assez simple:

Importez-les:

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

Et puis placez cet extrait de code là où vous souhaitez modifier le presse-papiers:

String myString = "This text will be copied into clipboard";
StringSelection stringSelection = new StringSelection(myString);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, null);
LouwHopley
la source
1
nous pouvons définirContents () avec le propriétaire aussi stackoverflow.com/questions/3591945/…
Aquarius Power
@AquariusPower Il semble que passer stringSelectioncomme le 2ème argument à setContents(..)aussi, en faire le ClipboardOwner, comme dans la réponse liée, n'a aucune signification: regarder la source , la seule méthode ClipboardOwnerqu'elle implémente, à savoir lostOwnership(..), est vide. Ainsi, le 2ème argument semble être un rappel complètement optionnel.
Evgeni Sergeev
@EvgeniSergeev cela peut être utile si nous étendons StringSelection :)
Aquarius Power
1
Porté à Clojure:(-> (java.awt.Toolkit/getDefaultToolkit) .getSystemClipboard (.setContents (java.awt.datatransfer.StringSelection. "test") nil))
NikoNyrh
Dans quel contexte avez-vous testé cela? Depuis une application GUI? Sur quelle plateforme? Cela fonctionne-t-il en réglant le presse-papiers 100 fois de suite (avec une pause appropriée entre chaque série)?
Peter Mortensen
18

Voici la réponse acceptée écrite de manière décorative:

Toolkit.getDefaultToolkit()
        .getSystemClipboard()
        .setContents(
                new StringSelection(txtMySQLScript.getText()),
                null
        );
Wesos de Queso
la source
18

La classe suivante vous permet de copier / coller une chaîne vers / depuis le presse-papiers.

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
la source
1
Peut avoir besoin d'une logique pour coller dans OS X car c'est spécial.
Ben Leggiero
1
@BenLeggiero: réponse tardive mais n'hésitez pas à suggérer une modification pour OS Xmieux soutenir au cas où cela ne fonctionnerait pas correctement
BullyWiiPlaza
1
si jamais j'ai besoin de recommencer, je mettrai à jour. Probablement, il est en train de vérifier le système d' exploitation actuel, et échangeant VK_CONTROLpour VK_METAsi elle est MacOs.
Ben Leggiero le
C'est ce dont j'ai besoin.
5377037
2

J'ai trouvé un meilleur moyen de le faire afin que vous puissiez obtenir une entrée d'une txtbox ou faire générer quelque chose dans cette zone de texte et pouvoir cliquer sur un bouton pour le faire.!

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
la source
1
Qu'entendez-vous par «2017/2018»? Une version particulière de Java? Quelle version avez - vous utilisée?
Peter Mortensen
1

Pour les applications basées sur 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 peut enregistrer plusieurs données dans plusieurs formats de données comme (html, url, texte brut, image).

Pour plus d'informations, voir la documentation officielle

prasadg
la source