java 如何使用WINDOWS下的剪贴板?
我想把程序里面的1个String 自动复制到WINDOWS系统剪贴板底下 以后操作直接用ctrl+V就能按出来 怎么做?
[解决办法]
帮忙顶
[解决办法]
如果是JTextArea,JTextField等,用它的copy(),cut(),paste()方法,如果想复制Image或想玩转系统的剪切板,请用java.awt.datatransfer包.
[解决办法]
簡單的將String寫入到操作系統的剪貼板中,可以參考:
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
public class WriteString
{
public static void main(String[] args)
{
Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();
setClipboardString(sysc, "寫入剪貼板的String ");
}
protected static void setClipboardString(Clipboard clip, String writeMe) {
Transferable tText = new StringSelection(writeMe);
clip.setContents(tText, null);
}
}
由於拷貝String,jdk中已經有類StringSelection支持,如果要拷貝一個文件,或者目錄,則要參考此類,對其進行修改,類名:FileSelection.java (改的可能不是很成功,但能夠用)
內容為:
/* @(#)FileSelection.java 07/05/14
* @author me
* Copy file from FoxEDM,Paste to System(e.g:2000 or xp etc)
*/
package com.foxera.foxlink.ui;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.*;
import java.util.List;
import java.util.ArrayList;
/**
* A <code> Transferable </code> which implements the capability required
* to transfer a <code> String </code> .
*
* This <code> Transferable </code> properly supports
* <code> DataFlavor.javaFileListFlavor </code>
* and all equivalent flavors. Support for
* <code> DataFlavor.plainTextFlavor </code>
* and all equivalent flavors is <b> deprecated </b> . No other
* <code> DataFlavor </code> s are supported.
*
* @see java.awt.datatransfer.DataFlavor#javaFileListFlavor
* @see java.awt.datatransfer.DataFlavor#plainTextFlavor
*/
public class FileSelection implements Transferable, ClipboardOwner {
private static final int FILE= 0;
private static final int PLAIN_FILE = 1;
private static final DataFlavor[] flavors = {
DataFlavor.javaFileListFlavor,
DataFlavor.javaFileListFlavor
};
private List data;
/**
* Creates a <code> Transferable </code> capable of transferring
* the specified <code> String </code> .
*/
public FileSelection(List data) {
this.data = data;
}
/**
* Returns an array of flavors in which this <code> Transferable </code>
* can provide the data. <code> DataFlavor.javaFileListFlavor </code>
* is properly supported.
* Support for <code> DataFlavor.plainTextFlavor </code> is
* <b> deprecated </b> .
*
* @return an array of length two, whose elements are <code> DataFlavor.
* stringFlavor </code> and <code> DataFlavor.plainTextFlavor </code>
*/
public DataFlavor[] getTransferDataFlavors() {
// returning flavors itself would allow client code to modify
// our internal behavior
return (DataFlavor[])flavors.clone();
}
/**
* Returns whether the requested flavor is supported by this
* <code> Transferable </code> .
*
* @param flavor the requested flavor for the data
* @return true if <code> flavor </code> is equal to
* <code> DataFlavor.javaFileListFlavor </code> or
* <code> DataFlavor.plainTextFlavor </code> ; false if <code> flavor </code>
* is not one of the above flavors
* @throws NullPointerException if flavor is <code> null </code>
*/
public boolean isDataFlavorSupported(DataFlavor flavor) {
// JCK Test StringSelection0003: if 'flavor ' is null, throw NPE
for (int i = 0; i < flavors.length; i++) {
if (flavor.equals(flavors[i])) {
return true;
}
}
return false;
}
/**
* Returns the <code> Transferable </code> 's data in the requested
* <code> DataFlavor </code> if possible. If the desired flavor is
* <code> DataFlavor.javaFileListFlavor </code> , or an equivalent flavor,
* the <code> String </code> representing the selection is
* returned. If the desired flavor is
* <code> DataFlavor.plainTextFlavor </code> ,
* or an equivalent flavor, a <code> Reader </code> is returned.
* <b> Note: </b> The behavior of this method for
* </code> DataFlavor.plainTextFlavor </code>
* and equivalent <code> DataFlavor </code> s is inconsistent with the
* definition of <code> DataFlavor.plainTextFlavor </code> .
*
* @param flavor the requested flavor for the data
* @return the data in the requested flavor, as outlined above
* @throws UnsupportedFlavorException if the requested data flavor is
* not equivalent to either <code> DataFlavor.stringFlavor </code>
* or <code> DataFlavor.plainTextFlavor </code>
* @throws IOException if an IOException occurs while retrieving the data.
* By default, StringSelection never throws this exception, but a
* subclass may.
* @throws NullPointerException if flavor is <code> null </code>
* @see java.util.ArrayList <E>
*/
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException
{
if (flavor.equals(flavors[FILE])) {
return (Object)data;
} else if (flavor.equals(flavors[PLAIN_FILE])) {
return new ArrayList <File> (data == null ? null : data);
} else {
throw new UnsupportedFlavorException(flavor);
}
}
public void lostOwnership(Clipboard clipboard, Transferable contents) {
}
}
測試代碼為:
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.Transferable;
import java.util.List;
import java.io.File;
import java.util.ArrayList;
public class WriteFile
{
public static void main(String[] args)
{
Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();
File file = new File( "c:\\1.txt ");//目錄也可以
List <File> listFile = new ArrayList <File> ();
listFile.add(file);
setClipboardFile(sysc,listFile);
}
protected static void setClipboardFile(Clipboard clip, List writeMe) {
Transferable tFile = new FileSelection(writeMe);
clip.setContents(tFile, null);
}
}
從操作系統的剪貼板中讀取資料,可以參考:
protected static String getClipboardContent(Clipboard clip) throws Exception{
//get content from clipboard
Transferable clipT = clip.getContents(null);
if (clipT != null) {
// check content 's type
if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor))
{
return (String)clipT.getTransferData(DataFlavor.stringFlavor);
}
else if(clipT.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
{
Object ob = clipT.getTransferData(DataFlavor.javaFileListFlavor);
List fileList = (List)ob;
if((fileList != null)&&(fileList.size() > 0))
{
for(int k=0;k <fileList.size();k++)
{
System.out.println(((File)fileList.get(k)).getAbsolutePath());
//根據路徑拷貝文件
}
}
}
}
return null;
}
[解决办法]
ding
[解决办法]
up
