首先,我们看一个拖放程序。
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.events.MenuAdapter;
import org.eclipse.swt.events.MenuEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class ClipboardSample {
public static void main(String[] args){
Display display = new Display();
Shell shell = new Shell(display);
//剪贴板
final Clipboard cb = new Clipboard(display);
shell.setLayout(new FillLayout());
shell.setText("Clipboard Sample");
final Text content = new Text(shell, SWT.BORDER | SWT.MULTI | SWT.WRAP);
Menu menu = new Menu(shell, SWT.POP_UP);
final MenuItem copyItem = new MenuItem(menu, SWT.PUSH);
copyItem.setText("复制");
copyItem.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
String selection = content.getSelectionText();
if(selection.length()==0)
return ;
Object[] data = new Object[]{selection};
Transfer[] types = new Transfer[]{TextTransfer.getInstance()};
cb.setContents(data, types);
}
});
final MenuItem pasteItem = new MenuItem(menu, SWT.PUSH);
pasteItem.setText("粘贴");
pasteItem.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
String string = (String)(cb.getContents(TextTransfer.getInstance()));
if(string != null)
content.insert(string);
}
});
menu.addMenuListener(new MenuAdapter(){
public void menuShown(MenuEvent e){
String selection = content.getSelectionText();
copyItem.setEnabled(selection.length()>0);
TransferData[] available = cb.getAvailableTypes();
boolean enabled = false;
for(int i=0;i<available.length;i++){
if(TextTransfer.getInstance().isSupportedType(available[i])){
enabled = true;
break;
}
}
pasteItem.setEnabled(enabled);
}
});
content.setMenu(menu);
shell.setSize(300, 150);
shell.open();
while(!shell.isDisposed()){
if(!display.readAndDispatch())
display.sleep();
}
cb.dispose();
display.dispose();
}
}
下面是一个实现了可以进行复制粘贴操作的文本编辑器。
import java.io.File;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.DropTargetListener;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
public class DragTree {
public static void main(String[] args){
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final Tree tree = createFolderTree(shell);
dragSource.addDragListener(new DragSourceListener(){
public void dragStart(DragSourceEvent event){
if(tree.getSelectionCount()==0)
event.doit = false;
}
public void dragSetData(DragSourceEvent event){
if(TextTransfer.getInstance().isSupportedType(event.dataType)){
event.data = tree.getSelection()[0].getText(0);
}
}
public void dragFinished(DragSourceEvent arg0) {
}
});
//拖放源,设置为tree
DragSource dragSource = new DragSource(tree, DND.DROP_MOVE | DND.DROP_COPY);
dragSource.setTransfer(new Transfer[]{TextTransfer.getInstance()});
//拖放目标,也设置为tree
DropTarget dropTarget = new DropTarget(tree, DND.DROP_MOVE | DND.DROP_DEFAULT | DND.DROP_COPY);
dropTarget.setTransfer(new Transfer[]{TextTransfer.getInstance()});
dropTarget.addDropListener(new DropTargetListener(){
public void dragEnter(DropTargetEvent event){
if(event.detail == DND.DROP_DEFAULT)
event.detail = DND.DROP_COPY;
}
public void dragOperationChanged(DropTargetEvent event){
if(event.detail == DND.DROP_DEFAULT)
event.detail = DND.DROP_COPY;
}
public void dragOver(DropTargetEvent event){
event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_SELECT;
}
public void drop(DropTargetEvent event){
if(event.item == null)
return;
TreeItem eventItem = (TreeItem)event.item;
if(TextTransfer.getInstance().isSupportedType(event.currentDataType)){
String s = (String)event.data;
TreeItem newItem = null;
if(eventItem.getParentItem() == null)
newItem = new TreeItem(eventItem.getParent(), SWT.NONE);
else
newItem = new TreeItem(eventItem.getParentItem(), SWT.NONE);
newItem.setText(s);
}
}
public void dragLeave(DropTargetEvent event){}
public void dropAccept(DropTargetEvent event){}
});
shell.setSize(300, 150);
shell.open();
while(!shell.isDisposed()){
if(!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
public static Tree createFolderTree(Composite parent){
Tree tree = new Tree(parent, SWT.BORDER | SWT.SINGLE);
File root = new File("E:\\DOWNLOAD");
File[] files = root.listFiles();
for(int i=0;i<files.length;i++){
TreeItem item = new TreeItem(tree, SWT.NONE);
item.setText(files[i].getName());
if(files[i].isDirectory())
setDirectory(files[i], item);
}
return tree;
}
public static void setDirectory(File file, TreeItem parent){
File[] files = file.listFiles();
for(int i=0;i<files.length;i++){
TreeItem item = new TreeItem(parent, SWT.NONE);
item.setText(files[i].getName());
if(files[i].isDirectory())
setDirectory(files[i], item);
}
}
}
setContents 用于设置剪贴板内容。