SWT 的拖放操作,DragSource 和 DropTarget 与剪切板(Clipboard)

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值