Копіювання тексту у буфер обміну за допомогою 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.