Java kullanarak metin panoya kopyalama


139

Metnin bir JTablehücresinden panoya kopyalamak ve Microsoft Word gibi diğer programlara yapıştırılabilmesini sağlamak istiyorum. Metin var JTable, ama panoya kopyalamak nasıl emin değilim.

Yanıtlar:


270

Bu benim için çalışıyor ve oldukça basit:

Bunları içe aktarın:

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

Ardından, bu kod snippet'ini panoyu değiştirmek istediğiniz yere yerleştirin:

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

1
biz de sahibi ileContents () ayarlayabilirsiniz stackoverflow.com/questions/3591945/…
Kova Gücü

@AquariusPower stringSelectionİkinci argüman olarak setContents(..)da geçmenin ClipboardOwner, bağlantılı cevapta olduğu gibi bunu yapmanın bir önemi yok gibi görünüyor: kaynağa bakmak, ClipboardOwneruyguladığı tek yöntem , yani lostOwnership(..)boş. Yani, ikinci argüman tamamen isteğe bağlı bir geri arama gibi görünüyor.
Evgeni Sergeev

@EvgeniSergeev StringSelection'ı genişletirsek faydalı olabilir :)
Aquarius Power

1
(-> (java.awt.Toolkit/getDefaultToolkit) .getSystemClipboard (.setContents (java.awt.datatransfer.StringSelection. "test") nil))
Clojure'a Taşındı

Bunu hangi bağlamda test ettiniz? Bir GUI uygulamasından mı? Hangi platformda? Panoyu arka arkaya 100 kez ayarlamaya çalışır mı (her set arasında uygun bir duraklama ile)?
Peter Mortensen

18

Dekoratif bir şekilde yazılmış kabul edilen cevap budur:

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

18

Aşağıdaki sınıf bir String'i panodan kopyalayıp yapıştırmanıza izin verir.

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
Özel olduğundan OS X'e yapıştırmak için bir mantık gerekebilir.
Ben Leggiero

1
@BenLeggiero: Geç cevap ama OS Xdüzgün çalışmadığı takdirde daha iyi desteklemek için bir düzenleme önermek için çekinmeyin
BullyWiiPlaza

1
bunu tekrar yapmam gerekirse güncellerim. Olasılıkla, sadece şimdiki OS kontrol ve dışarı takas oluyor VK_CONTROLiçin VK_METAo MacOS buysa.
Ben Leggiero

İhtiyacım olan bu.
5377037

2

Bunu yapmanın daha iyi bir yolunu buldum, böylece bir txtbox'tan bir girdi alabilir veya o metin kutusunda bir şey oluşturulabilir ve bunu yapmak için bir düğmeyi tıklayabilirsiniz.

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" ile ne demek istiyorsun? Java'nın belirli bir sürümü mü? Hangi sürümü mi kullanmak?
Peter Mortensen

1

İçin JavaFX tabanlı uygulamalar.

        //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 , birden çok veriyi (html, url, düz metin, resim) gibi çeşitli veri biçimlerinde kaydedebilir.

Daha fazla bilgi için resmi belgelere bakın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.