Копирование текста в буфер обмена с помощью Java


149

Я хочу скопировать текст из JTableячейки в буфер обмена, сделав его доступным для вставки в другие программы, такие как Microsoft Word. У меня есть текст из файла JTable, но я не знаю, как его скопировать в буфер обмена.

Ответы:


285

Это работает для меня и довольно просто:

Импортируйте это:

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

А затем поместите этот фрагмент кода туда, где вы хотите изменить буфер обмена:

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

1
мы также можем установитьContents () с владельцем stackoverflow.com/questions/3591945/…
Водолей Сила

@AquariusPower Кажется, что передача stringSelectionв качестве второго аргумента setContents(..)тоже, что делает его ClipboardOwner, как в связанном ответе, не имеет значения: глядя на источник , единственный метод, ClipboardOwnerкоторый он реализует, а именно, lostOwnership(..)пуст. Итак, второй аргумент кажется совершенно необязательным обратным вызовом.
Евгений Сергеев

@EvgeniSergeev, может быть полезно, если мы расширим StringSelection :)
Водолей Сила

1
Портировано на Clojure:(-> (java.awt.Toolkit/getDefaultToolkit) .getSystemClipboard (.setContents (java.awt.datatransfer.StringSelection. "test") nil))
NikoNyrh

В каком контексте вы это тестировали? Из приложения с графическим интерфейсом? На какой платформе? Работает ли установка буфера обмена 100 раз подряд (с соответствующей паузой между каждым набором)?
Питер Мортенсен

21

Следующий класс позволяет копировать / вставлять строку в / из буфера обмена.

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
Может потребоваться некоторая логика для вставки в OS X, поскольку она особенная.
Ben Leggiero

1
@BenLeggiero: Поздний ответ, но не стесняйтесь предлагать отредактировать для OS Xлучшей поддержки, если он не работает должным образом
BullyWiiPlaza

1
если мне когда-нибудь понадобится сделать это снова, я обновлюсь. Скорее всего, это просто проверка текущей операционной системы, и выгрузив VK_CONTROLдля VK_METAесли это MacOS.
Бен Легжеро,

Это то, что мне нужно.
5377037

20

Это принятый ответ, написанный декоративно:

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

4

Для приложений на базе 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 может сохранять несколько данных в нескольких форматах данных, таких как (html, url, простой текст, изображение).

Для получения дополнительной информации см. Официальную документацию


2

Я нашел лучший способ сделать это, чтобы вы могли получить ввод из текстового поля или создать что-то в этом текстовом поле и иметь возможность щелкнуть кнопку, чтобы сделать это.!

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
Что вы имеете в виду под «2017/2018»? Конкретная версия Java? Какую версию так вы использовали?
Питер Мортенсен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.