您的位置:首页 > 其它

SWT中的拖放支持

2015-08-03 19:27 239 查看
拖放操作无非是将源的数据放置到目标对象中,SWT的处理是在托的过程中将java的数据转化为本地保存的全局变量数据,然后在放的过程中,再从本地保存的全局变量中将数据取出,SWT中使用transfer类来定义一个转化数据的过程。拖放主要需要理解3个概念:托放源、传输数据和托放目标。

处理托放目标事件

与拖放源对象的处理事件类似,当光标进入到目标对象区域时便会触发目标对象的相关事件。

传输数据

传输数据类提供了将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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: