Copiar texto al portapapeles usando Java

139

Quiero copiar el texto de una JTablecelda al portapapeles, de modo que esté disponible para pegarlo en otros programas como Microsoft Word. Tengo el texto del JTable, pero no estoy seguro de cómo copiarlo en el portapapeles.

usuario765134
fuente

Respuestas:

270

Esto funciona para mí y es bastante simple:

Importar estos:

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

Y luego coloque este fragmento de código donde quiera alterar el portapapeles:

String myString = "This text will be copied into clipboard";
StringSelection stringSelection = new StringSelection(myString);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, null);
LouwHopley
fuente
1
podemos establecer contenido () con el propietario también stackoverflow.com/questions/3591945/…
Aquarius Power
@AquariusPower Parece que pasar stringSelectioncomo el segundo argumento setContents(..)también, convirtiéndolo en ClipboardOwner, como en la respuesta vinculada, no tiene importancia: mirando la fuente , el único método ClipboardOwnerque implementa, es decir lostOwnership(..), está vacío. Entonces, el segundo argumento parece ser una devolución de llamada completamente opcional.
Evgeni Sergeev
@EvgeniSergeev puede ser útil si ampliamos StringSelection :)
Aquarius Power
1
Portado a Clojure:(-> (java.awt.Toolkit/getDefaultToolkit) .getSystemClipboard (.setContents (java.awt.datatransfer.StringSelection. "test") nil))
NikoNyrh
¿En qué contexto probaste esto? ¿Desde una aplicación GUI? ¿En qué plataforma? ¿Funciona configurando el portapapeles 100 veces seguidas (con alguna pausa apropiada entre cada conjunto)?
Peter Mortensen
18

Esta es la respuesta aceptada escrita de manera decorativa:

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

La siguiente clase le permite copiar / pegar una Cadena en / desde el portapapeles.

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
fuente
1
Puede necesitar algo de lógica para pegar en OS X ya que es especial.
Ben Leggiero
1
@BenLeggiero: Respuesta tardía, pero siéntase libre de sugerir una edición para admitir OS Xmejor en caso de que no funcione correctamente
BullyWiiPlaza
1
Si alguna vez necesito hacer esto nuevamente, lo actualizaré. Probable, es sólo comprobar el sistema operativo actual, y el canje de VK_CONTROLpor VK_METAsi es macOS.
Ben Leggiero
Esto es lo que lo necesito.
5377037
2

Encontré una mejor manera de hacerlo para que pueda obtener una entrada de un cuadro de texto o hacer que se genere algo en ese cuadro de texto y poder hacer clic en un botón para hacerlo.

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
fuente
1
¿Qué quieres decir con "2017/2018"? ¿Una versión particular de Java? ¿Qué versión usaste ?
Peter Mortensen
1

Para aplicaciones basadas en 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());
        }

Portapapeles puede guardar múltiples datos en varios formatos de datos como (html, url, texto plano, imagen).

Para más información ver documentación oficial

prasadg
fuente