Копіювання тексту у буфер обміну за допомогою Java


139

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

Відповіді:


270

Це працює для мене і досить просто:

Імпортуйте такі:

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/…
Power Aquarius Power

@AquariusPower Здається, що передача stringSelectionцього аргументу як другий аргумент setContents(..)теж не робить його ClipboardOwner, як у пов'язаній відповіді, не має значення: дивлячись на джерело , єдиний метод, ClipboardOwnerякий він реалізує, а саме lostOwnership(..)- порожній. Отже, 2-й аргумент здається абсолютно необов’язковим зворотним зв'язком.
Євгеній Сергєєв

@EvgeniSergeev це може бути корисно, якщо ми продовжимо StringSelection :)
Водолій Сила

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

У якому контексті ви це протестували? Від програми GUI? На якій платформі? Чи працює установка буфера обміну 100 разів підряд (з певною паузою між кожним набором)?
Пітер Мортенсен

18

Це прийнята відповідь, написана декоративним способом:

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

18

Наступний клас дозволяє скопіювати / вставити String в / з буфера обміну.

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

1
@BenLeggiero: Пізня відповідь, але не соромтеся запропонувати редагувати, щоб підтримати OS Xкраще, якщо вона не працює належним чином
BullyWiiPlaza

1
якщо мені колись доведеться це зробити ще раз, я оновлю. Ймовірно, це просто перевірка поточної ОС та заміна VK_CONTROLна VK_METAнаявність macOS.
Бен Леджієро

Це те, що мені потрібно.
5377037

2

Я знайшов кращий спосіб зробити це, щоб ви могли отримати вхід із txtbox або створити щось у цьому текстовому полі та мати можливість натиснути кнопку, щоб це зробити.

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? Яку версію так ви використовували?
Пітер Мортенсен

1

Для додатків на основі 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, звичайний текст, зображення).

Для отримання додаткової інформації див офіційну документацію

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.