0

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

昨天我遇到了这个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;
}
4

2 回答 2

1

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

不知道为什么你必须等待设置剪贴板的内容。

该程序每 200 毫秒刷新一次剪贴板没有任何问题。也就是说,每次按预期显示时,数字都会增加 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。

于 2013-02-06T16:45:34.607 回答
0

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

基本上,如果您只想在不使用任何 Swing 组件的情况下将字符串发送到剪贴板,则设置 a 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.");
    }
} );
于 2013-02-06T15:00:15.363 回答