我已经尝试了一个月,以便在我的程序中可靠地设置系统剪贴板。目前它的工作量约为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;
}
答案 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.");
}
} );