Copiando texto para a área de transferência usando Java

139

Quero copiar o texto da JTablecélula de uma para a área de transferência, disponibilizando-o para ser colado em outros programas, como o Microsoft Word. Eu tenho o texto do JTable, mas não tenho certeza de como copiá-lo para a área de transferência.

user765134
fonte

Respostas:

270

Isso funciona para mim e é bastante simples:

Importe estes:

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

E, em seguida, coloque esse trecho de código onde quiser alterar a área de transferência:

String myString = "This text will be copied into clipboard";
StringSelection stringSelection = new StringSelection(myString);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, null);
LouwHopley
fonte
1
podemos setContents () com o proprietário também stackoverflow.com/questions/3591945/…
Aquarius Power
@AquariusPower Parece que passar stringSelectioncomo o segundo argumento setContents(..)também, tornando-o ClipboardOwner, como na resposta vinculada, não tem significado: olhar para a fonte , o único método ClipboardOwnerimplementado por ela, ou seja lostOwnership(..), está vazio. Portanto, o segundo argumento parece ser um retorno de chamada completamente opcional.
Evgeni Sergeev
@EvgeniSergeev pode ser útil se estender StringSelection :)
Aquarius Poder
1
Portado para Clojure:(-> (java.awt.Toolkit/getDefaultToolkit) .getSystemClipboard (.setContents (java.awt.datatransfer.StringSelection. "test") nil))
NikoNyrh
Em que contexto você testou isso? De um aplicativo GUI? Em qual plataforma? Funciona configurando a área de transferência 100 vezes seguidas (com uma pausa apropriada entre cada conjunto)?
Peter Mortensen
18

Esta é a resposta aceita, escrita de forma decorativa:

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

A classe a seguir permite copiar / colar uma String para / da área de transferência.

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
fonte
1
Pode precisar de alguma lógica para colar no OS X, pois é especial.
Ben Leggiero 29/07
1
@BenLeggiero: Resposta tardia, mas sinta-se à vontade para sugerir uma edição para oferecer suporte OS Xmelhor, caso ela não esteja funcionando corretamente
BullyWiiPlaza 16/02
1
se eu precisar fazer isso novamente, atualizarei. Provavelmente, é só verificar o sistema operacional atual e trocar VK_CONTROLpor VK_METAse é MacOS.
Ben Leggiero 16/02
É disso que eu preciso.
5377037 30/04
2

Encontrei uma maneira melhor de fazê-lo para que você possa obter uma entrada de um txtbox ou gerar algo nessa caixa de texto e clicar em um botão para fazer isso.

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
fonte
1
O que você quer dizer com "2017/2018"? Uma versão específica do Java? Qual a versão que você usa?
Peter Mortensen
1

Para aplicativos baseados em 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());
        }

O ClipboardContent pode salvar vários dados em vários formatos, como (html, url, texto sem formatação, imagem).

Para mais informações, consulte a documentação oficial

prasadg
fonte