首先,我们看一个拖放程序。
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 用于设置剪贴板内容。