SWT中的拖放支持
2015-08-03 19:27
239 查看
拖放操作无非是将源的数据放置到目标对象中,SWT的处理是在托的过程中将java的数据转化为本地保存的全局变量数据,然后在放的过程中,再从本地保存的全局变量中将数据取出,SWT中使用transfer类来定义一个转化数据的过程。拖放主要需要理解3个概念:托放源、传输数据和托放目标。
处理托放目标事件
与拖放源对象的处理事件类似,当光标进入到目标对象区域时便会触发目标对象的相关事件。
传输数据
传输数据类提供了将java数据和本地操作系统书库交换的手段,该类是一个抽象类,在使用传输数据类时,通常使用Tansfer子类,String类型的数据需要使用Textranfer类,string[]数组类型的数据要使用fileTransfer类。
下面用一个简单购物车的程序来实现拖放的功能。
处理托放目标事件
与拖放源对象的处理事件类似,当光标进入到目标对象区域时便会触发目标对象的相关事件。
传输数据
传输数据类提供了将java数据和本地操作系统书库交换的手段,该类是一个抽象类,在使用传输数据类时,通常使用Tansfer子类,String类型的数据需要使用Textranfer类,string[]数组类型的数据要使用fileTransfer类。
下面用一个简单购物车的程序来实现拖放的功能。
package block; 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.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; public class DragDropSample { public static void main(String[] args){ Display display = new Display(); Shell shell = new Shell(display,SWT.NONE); shell.setText("drag and drop sample"); GridLayout layout = new GridLayout(); layout.numColumns = 2; shell.setLayout(layout); /*创建左侧的产品表格*/ final Table productLsit = createProductTable(shell); /*创建右侧的产品表格*/ final Table shoppingCart = createCartTable(shell); /*创建拖放源*/ DragSource source = new DragSource(productLsit, DND.DROP_MOVE|DND.DROP_COPY); /*设置传输的数据为文本型String类型*/ source.setTransfer(new Transfer[] {TextTransfer.getInstance()}); /*注册当拖动源时触发的事件*/ source.addDragListener(new DragSourceListener() { /*当开始拖动源控件时*/ @Override public void dragStart(DragSourceEvent event) { if(productLsit.getSelectionCount() == 0) event.doit = false; } /*设置拖放过程中传输的数据*/ @Override public void dragSetData(DragSourceEvent event) { if(TextTransfer.getInstance().isSupportedType(event.dataType)){ //获取当前选中的一行 TableItem item = productLsit.getSelection()[0]; event.data = item.getText(0)+","+item.getText(2); } } @Override public void dragFinished(DragSourceEvent event) { } }); /*定义拖放的目标控件*/ DropTarget target = new DropTarget(shoppingCart,DND.DROP_COPY|DND.DROP_DEFAULT); /*设置目标控件所接受的传输数据*/ target.setTransfer(new Transfer[]{TextTransfer.getInstance()}); target.addDropListener(new DropTargetListener() { @Override public void dropAccept(DropTargetEvent event) { } /*拖放完后触发的事件*/ @Override public void drop(DropTargetEvent event) { //首先获得当前目标表格项 TableItem item =(TableItem)event.item; if(item == null){ event.detail = DND.DROP_NONE; return; } //如果支持文本型传输数据 if(TextTransfer.getInstance().isSupportedType(event.currentDataType)){ //首先获得源数据中的字符串数据,该数据是用过dragSetData()方法设置的 //例如此时获得的数据dataInfo为“CPU,1200”; String dataInfo = (String)event.data; if(dataInfo == null) return; //首先解析逗号分割的字符串,逗号之前的字符为产品名,逗号之后的字符为价格 int index = dataInfo.indexOf(","); String name = dataInfo.substring(0, index); double price = 0.00d; price = Double.parseDouble(dataInfo.substring(index+1)); //获得目标表格 Table parent = item.getParent(); TableItem it = null; //循环目标表格中的每一项,是否购物车中已经添加了该产品 for(int i=0;i<parent.getItemCount();i++){ TableItem temp = parent.getItem(i); if(temp.getText(0).equals(name)){ it = temp; break; } } //如果没有找到你,则新建一行,数量加1,并显示总价格 if(it == null){ it = new TableItem(parent, SWT.NONE); it.setText(0,name); it.setText(1,"1"); it.setText(2,""+price); }else{ //如果找到,更新铲平的数量和总价格 int number = Integer.parseInt(it.getText(1))+1; double total = number*price; it.setText(1,""+number); it.setText(1,""+total); } //最后更新购物车的总价和数量 TableItem sumItem = parent.getItem(0); sumItem.setText(1, Integer.parseInt(sumItem.getText(1))+1+""); sumItem.setText(2,Double.parseDouble(sumItem.getText(2))+price+""); } } /*当光标在目标区域时*/ @Override public void dragOver(DropTargetEvent event) { } /*当改变event.detail类型时触发的事件*/ @Override public void dragOperationChanged(DropTargetEvent event) { if(event.detail == DND.DROP_DEFAULT) event.detail = DND.DROP_COPY; } /*当光标离开目标控件的区域时*/ @Override public void dragLeave(DropTargetEvent event) { } /*当光标进入目标控件的区域时*/ @Override public void dragEnter(DropTargetEvent event) { if(event.detail == DND.DROP_DEFAULT) event.detail = DND.DROP_COPY; } }); shell.pack(); shell.open(); while(!shell.isDisposed()){ if(!display.readAndDispatch()) display.sleep(); } } private static Table createCartTable(Composite parent) { Table table = new Table(parent, SWT.FULL_SELECTION|SWT.SINGLE); String[] headers = {"产品名称","单位","价格"}; for(int i=0;i<headers.length;i++){ TableColumn col = new TableColumn(table, SWT.NONE); col.setText(headers[i]); } TableItem item = new TableItem(table, SWT.NONE); item.setText(new String[]{"cpu","个","1200.00"}); item = new TableItem(table, SWT.NONE); item.setText(new String[]{"内存","个","255.00"}); item = new TableItem(table, SWT.NONE); item.setText(new String[]{"笔记本","个","9800.00"}); table.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true)); table.setHeaderVisible(true); table.setLinesVisible(true); for(int i =0;i<headers.length;i++){ table.getColumns()[i].pack(); } return table; } private static Table createProductTable(Composite parent) { Table table = new Table(parent, SWT.FULL_SELECTION); String[] headers = {"产品名称","数量","总价格"}; for(int i = 0;i<headers.length;i++){ TableColumn col = new TableColumn(table, SWT.NONE); col.setText(headers[i]); } TableItem item = new TableItem(table, SWT.NONE); item.setText(new String[]{"","0","0.00"}); table.setHeaderVisible(true); table.setLinesVisible(true); table.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true)); for(int i=0;i<headers.length;i++){ table.getColumns()[i].pack(); } return table; } }
相关文章推荐
- Python模块MySQLdb操作mysql出现2019错误:Can't initialize character set utf-8
- 2097 Sky数
- 安卓NDK 问题 Unresolved inclusion: <jni.h> 解决方案
- javafx 运行在android上遇到的难题-完美解决
- html5 cache manifes异常问题
- 浅谈安卓中的LayoutInflater
- 移动端学习系列1--meta标签
- Linux多线程——使用互斥量同步线程
- Hdu
- 优秀的博客和网页
- html判断IE版本
- 工作一个月(2015年8月初)
- 后缀数组小结
- 网易前端微专业课程讨论区问答精选
- LeetCode Everyday--52
- MATCOM & C++ &数学表达式计算
- POJ 2528 Mayor's posters 并查集+离散化做法
- win8系统安装Oracle 11g报错:[INS-13001]环境不满足最低要求--解决办法
- 多态小结
- HDU 2689 Sort it (树状数组)