Copia del testo negli appunti usando Java


139

Voglio copiare il testo dalla JTablecella di un negli Appunti, rendendolo disponibile per essere incollato in altri programmi come Microsoft Word. Ho il testo dal JTable, ma non sono sicuro su come copiarlo negli appunti.

Risposte:


270

Questo funziona per me ed è abbastanza semplice:

Importa questi:

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

E quindi inserisci questo frammento di codice dove desideri modificare gli Appunti:

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

1
possiamo impostareContents () anche con il proprietario stackoverflow.com/questions/3591945/…
Aquarius Power

@AquariusPower Sembra che passare stringSelectionanche il secondo argomento setContents(..), rendendolo il ClipboardOwner, come nella risposta collegata, non abbia alcun significato: guardando la fonte , l'unico metodo ClipboardOwnerche implementa, vale a dire lostOwnership(..), è vuoto. Quindi, il secondo argomento sembra essere un callback completamente opzionale.
Evgeni Sergeev,

@EvgeniSergeev potrebbe essere utile se estendiamo StringSelection :)
Aquarius Power

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

In quale contesto hai provato questo? Da un'applicazione GUI? Su quale piattaforma? Funziona impostando gli Appunti 100 volte di seguito (con una pausa appropriata tra ogni set)?
Peter Mortensen,

18

Questa è la risposta accettata scritta in modo decorativo:

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

18

La seguente classe consente di copiare / incollare una stringa negli / dagli appunti.

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
Potrebbe essere necessario un po 'di logica per incollare in OS X poiché è speciale.
Ben Leggiero,

1
@BenLeggiero: risposta in ritardo ma sentiti libero di suggerire una modifica per supportare OS Xmeglio nel caso in cui non
funzioni

1
se mai dovessi farlo di nuovo, aggiornerò. Probabilmente, è solo il controllo del sistema operativo corrente, e sostituendo VK_CONTROLper VK_METAse è MacOS.
Ben Leggiero,

Questo è quello di cui ho bisogno.
5377037

2

Ho trovato un modo migliore per farlo in modo da poter ottenere un input da una txtbox o avere qualcosa da generare in quella casella di testo ed essere in grado di fare clic su un pulsante per farlo.!

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
Cosa intendi con "2017/2018"? Una versione particolare di Java? Quale versione hai utilizzato?
Peter Mortensen,

1

Per applicazioni basate su 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 può salvare più dati in diversi formati di dati come (html, url, testo normale, immagine).

Per ulteriori informazioni consultare la documentazione ufficiale

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.