Kar*_*ell 24 java ubuntu swing copy-paste awt
独立应用程序中的以下代码适用于ubuntu:
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
public class ClipboardTest {
public static void main(String[] args) throws Exception {
Clipboard clipBoard = Toolkit.getDefaultToolkit().getSystemClipboard();
// print the last copied thing
System.out.println(clipBoard.getContents(null).getTransferData(DataFlavor.stringFlavor));
StringSelection data = new StringSelection("NOW");
clipBoard.setContents(data, data);
// prints NOW
System.out.println(clipBoard.getContents(null).getTransferData(DataFlavor.stringFlavor));
}
}
Run Code Online (Sandbox Code Playgroud)
将(Ctrl + V)粘贴到不同的应用程序中不会产生任何结果; 我期待"现在".再次调用上面的代码会产生以下异常:
Exception in thread "main" java.awt.datatransfer.UnsupportedFlavorException: Unicode String
at sun.awt.datatransfer.ClipboardTransferable.getTransferData(ClipboardTransferable.java:160)
Run Code Online (Sandbox Code Playgroud)
作为一个独立的应用程序,这应该工作,即使经过2011安全更改.从JTextField内部通过Ctrl + C进行复制,然后粘贴到其他地方.
使用最新的java7(jdk1.7.0_10)和jdk1.6.0_33在ubuntu 11.04上都没有成功; 它应该工作,并在Windows 7上使用最新的java7和使用java6_37的mac osx 10.6上按预期工作.还尝试了xubuntu 12.04与那些javas,它在那里不起作用.这是一个linux/ubuntu错误吗?
Jon*_*eau 17
我在工作中遇到了与应用程序相同的问题,这是我发现的一篇文章,解释了原因和可能的解决方案.我希望它有所帮助.
剪贴板持久性是一个影响Ubuntu和其他基于X11的操作系统下的许多程序的错误.修复它是Google Summer of Code 2010项目.维基百科对此问题有一个很好的概述.如果要以用户身份进行修复,可以安装Parcellite或其他剪贴板管理器.如果要将其修复为程序员,可以修改程序以符合ClipboardManager规范.
使用gnome库,您可以在剪贴板上调用store方法并修复它.到目前为止,这是唯一值得尝试的东西.还看到了GTK类似的东西,但只是在Eclipse的bug中.
raf*_*ael 12
我用debian测试(7.0)和openjdk 7u3尝试了你的代码.结果是一样的,但我想我找到了问题(解决方案).
只要进程存在,剪贴板中的内容才有效.如果我将您的代码更改为:
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
public class ClipboardTest {
public static void main(String[] args) throws Exception {
Clipboard clipBoard = Toolkit.getDefaultToolkit().getSystemClipboard();
// print the last copied thing
Transferable t = clipBoard.getContents(null);
if (t.isDataFlavorSupported(DataFlavor.stringFlavor))
System.out.println(t.getTransferData(DataFlavor.stringFlavor));
StringSelection data = new StringSelection("NOW");
clipBoard.setContents(data, data);
// prints NOW
System.out.println(clipBoard.getContents(null).getTransferData(DataFlavor.stringFlavor));
System.in.read();
}
}
Run Code Online (Sandbox Code Playgroud)
if语句会阻止您的代码在没有可用内容时抛出异常,如果您运行一次代码并且该过程结束,则会发生这种情况.
System.in.read()只是让进程保持活动状态.虽然没有按回车,我可以粘贴到另一个应用程序,"现在"按预期出现.
像这样,代码每次都适合我.
希望这可以帮助.