使用默认编辑器工具包将文本放在系统剪贴板上

时间:2013-02-06 14:51:39

标签: java swing clipboard

我已经尝试了一个月,以便在我的程序中可靠地设置系统剪贴板。目前它的工作量约为95/100倍。但我一直在寻找。

昨天我遇到了这个the Java DefaultEditorKit.copyAction并且在内心死了,看到已经写了一些可能做我想做的事。

虽然问题在于这是对话的“动作”吗?

如何发出要复制到剪贴板的文字?我不希望将此“操作”附加到我的应用中的任何按钮/组件。我希望能够做到

DefaultEditorKit.copyAction("Put this on Clipboard");

但这是未定义的。我不确定如何触发这个“动作”并给它一些文字来处理?

编辑:这是导致异常的代码。

public void setClip2(String arg)
{
    while(true) 
    {
        try
        {
            sysClip.setContents(new StringSelection(arg), null);
        }
        catch(Exception e)
        {
            try {Thread.sleep(20);} catch (InterruptedException e1) {}
            continue;
        }
        break;
    }
    return;
}

2 个答案:

答案 0 :(得分:1)

  

我只是想知道是否有办法可靠地设置剪贴板。 (如果您没有等待足够长的时间尝试设置它,这种方法会失败,通常大约需要1-2秒

不确定为什么必须等待设置剪贴板的内容。

此程序每200ms刷新剪贴板没有任何问题。这是每次按预期显示的数字增量1:

import java.awt.*;
import java.awt.datatransfer.*;
import java.io.*;

class ClipboardLoopTest
{
    public static void main(String[] args)
        throws InterruptedException
    {
        for (int i = 0; i < 100; i++)
        {
            //  add data to clipboard

            try
            {
                Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
                StringSelection testData;
                testData = new StringSelection( "Test: " + i );
                c.setContents(testData, testData);

                //  Get clipboard contents, as a String

                Transferable t = c.getContents( null );

                if ( t.isDataFlavorSupported(DataFlavor.stringFlavor) )
                {
                    Object o = t.getTransferData( DataFlavor.stringFlavor );
                    String data = (String)t.getTransferData( DataFlavor.stringFlavor );
                    System.out.println( "Clipboard contents: " + data );
                }
            }
            catch(Exception e)
            {
                System.out.println(e);
            }

            Thread.sleep(200);
        }

        System.exit(0);
    }
}

我在Windows 7上使用JDK 7.

也许你可以发布证明问题的SSCCE。

答案 1 :(得分:0)

DefaultEditorKit.copyAction实际上使用(通过某些层)java.awt.datatransfer中的functionnality。在那里,您将找到将数据发送到剪贴板的类。

基本上,如果您只想在不使用任何Swing组件的情况下将字符串发送到剪贴板,则设置ClipboardOwner,创建一个StringSelection对象并将其提供给系统剪贴板。这是一个最基本的例子:

Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents( new StringSelection("Put this on Clipboard"), new ClipboardOwner() {

    @Override
    public void lostOwnership(Clipboard clipboard, Transferable contents) {
      System.out.println("I am no longer the clipboard owner.");
    }
} );