java.lang.NullPointerException
at org.eclipse.swt.dnd.DragSource.EnumFormatEtc(DragSource.java:400)
at org.eclipse.swt.dnd.DragSource.access$10(DragSource.java:393)
at org.eclipse.swt.dnd.DragSource$4.method8(DragSource.java:252)
at org.eclipse.swt.internal.ole.win32.COMObject.callback8(COMObject.java:135)
at org.eclipse.swt.internal.ole.win32.COM.DoDragDrop(Native Method)
at org.eclipse.swt.dnd.DragSource.drag(DragSource.java:306)
at org.eclipse.swt.dnd.DragSource.access$0(DragSource.java:277)
at org.eclipse.swt.dnd.DragSource$1.handleEvent(DragSource.java:164)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:928)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3348)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2968)
at src.test.open(test.java:52)
at src.test.main(test.java:37)
刚点击拖拽就出了上面那些异常,哪位懂得解释下原因。
下面是断源码:
package src;import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
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.FileTransfer;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;public class test { private Table dropTable;
private Tree dragTree;
protected Shell shell;
private TextTransfer textTransfer;
private FileTransfer fileTransfer; /**
* Launch the application
* @param args
*/
public static void main(String[] args) {
try {
test window = new test();
window.open();
} catch (Exception e) {
e.printStackTrace();
}
} /**
* Open the window
*/
public void open() {
final Display display = Display.getDefault();
createContents();
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
} /**
* Create contents of the window
*/
protected void createContents() {
shell = new Shell();
shell.setSize(500, 375);
shell.setText("SWT Application"); final SashForm sashForm = new SashForm(shell, SWT.NONE); dragTree = new Tree(sashForm, SWT.BORDER); DragSource source = new DragSource(dragTree, DND.DROP_MOVE
| DND.DROP_COPY);
source.setTransfer(new Transfer[] { textTransfer }); // 指定允许的传输类型
source.addDragListener(new MyDragSourceListener());
sashForm.setBounds(0, 0, 492, 341); dropTable = new Table(sashForm, SWT.BORDER);
dropTable.setLinesVisible(true);
dropTable.setHeaderVisible(true); DropTarget target = new DropTarget(dropTable, DND.DROP_MOVE
| DND.DROP_COPY | DND.DROP_DEFAULT);
target.setTransfer(new Transfer[] { textTransfer });
target.addDropListener(new MyDropTargetListener());
sashForm.setWeights(new int[] { 228, 261 });
textTransfer = TextTransfer.getInstance();
fileTransfer = FileTransfer.getInstance();
for (int i = 0; i < 10; i++) {
TreeItem item = new TreeItem(dragTree, SWT.NONE);
item.setText(" treeitem " + i);
for (int i2 = 0; i2 < 5; i2++) {
TreeItem subitem = new TreeItem(item, SWT.NONE);
subitem.setText(" subtreeitem " + i2);
}
}
for (int i = 0; i < 10; i++) {
TableItem item = new TableItem(dropTable, SWT.NONE);
item.setText(new String[] { " tableitem " + i, 100 + i + "" });
}
} class MyDragSourceListener implements DragSourceListener {
// 指定拖动开始的执行策略。
public void dragStart(DragSourceEvent event){
if (((DragSource)event.widget).getControl() instanceof Tree){
TreeItem selection = test. this .dragTree.getSelection()[ 0 ];
if (selection.getText().length() == 0 ){
event.doit = false ;
}
}
} // dragSetData方法在dragStart通过之后才被调用。这个方法可能会因为同一种传输类型多次set或
// 不同的多种传输类型的set而被多次调用,象windows等有些平台中,dropTarget可以在鼠标移动的
// 过程中请求数据,但是在Motif等平台中,只可以在drop操作完成之后才可以请求数据,所以在这个方
// 法中不要假设drag and drop操作已经完成.在这个方法中是无法知道data将被drop到哪里.
// set的Data也要符合指定的Transfer的format类型。
public void dragSetData(DragSourceEvent event){
if (TextTransfer.getInstance().isSupportedType(event.dataType)){
if (((DragSource)event.widget).getControl() instanceof Tree){
TreeItem selection = test. this .dragTree.getSelection()[ 0 ];
event.data = selection.getText();
}
}
} // 根据事先指定好的操作类型来处理操作结果
public void dragFinished(DragSourceEvent event){
if (event.detail == DND.DROP_MOVE){
if (((DragSource)event.widget).getControl() instanceof Tree){
TreeItem selection = test. this .dragTree.getSelection()[ 0 ];
selection.removeAll();
}
}
}
}class MyDropTargetListener implements DropTargetListener{
// dragEnter事件在drag and drop动作开始,并且鼠标进入了target widget的范围内时被调用。
public void dragEnter(DropTargetEvent event){
if (event.detail == DND.DROP_DEFAULT){
// 给event.detail赋的值必须是event.operations中的一个,event.operations中
// 的操作都是DragSource所支持的.
if ((event.operations & DND.DROP_COPY) != 0 ){
event.detail = DND.DROP_COPY;
} else {
event.detail = DND.DROP_NONE;
}
}
for ( int i = 0 ;i < event.dataTypes.length;i ++ ){
if (textTransfer.isSupportedType(event.dataTypes[i])){
event.currentDataType = event.dataTypes[i];
// 只允许COPY
if (event.detail != DND.DROP_COPY){
event.detail = DND.DROP_NONE;
}
break ;
}
}
}
public void dragOver(DropTargetEvent event){
event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
if (textTransfer.isSupportedType(event.currentDataType)){
String t = (String)(textTransfer.nativeToJava(event.currentDataType));
if (t != null ){
System.out.println(t);
}
}
} public void dragOperationChanged(DropTargetEvent event){
if (event.detail == DND.DROP_DEFAULT){
event.detail = DND.DROP_COPY;
} else {
event.detail = DND.DROP_NONE;
} // allow text to be moved but files should only be copied
if (fileTransfer.isSupportedType(event.currentDataType)){
if (event.detail != DND.DROP_COPY){
event.detail = DND.DROP_NONE;
}
}
}
public void dragLeave(DropTargetEvent event){
} public void dropAccept(DropTargetEvent event){
}
public void drop(DropTargetEvent event){
if (textTransfer.isSupportedType(event.currentDataType)){
String text = (String)event.data;
TableItem item = new TableItem(dropTable,SWT.NONE);
item.setText(text);
}
if (fileTransfer.isSupportedType(event.currentDataType)){
String[] files = (String[])event.data;
for ( int i = 0 ;i < files.length;i ++ ){
TableItem item = new TableItem(dropTable,SWT.NONE);
item.setText(files[i]);
}
}
}}
}
at org.eclipse.swt.dnd.DragSource.EnumFormatEtc(DragSource.java:400)
at org.eclipse.swt.dnd.DragSource.access$10(DragSource.java:393)
at org.eclipse.swt.dnd.DragSource$4.method8(DragSource.java:252)
at org.eclipse.swt.internal.ole.win32.COMObject.callback8(COMObject.java:135)
at org.eclipse.swt.internal.ole.win32.COM.DoDragDrop(Native Method)
at org.eclipse.swt.dnd.DragSource.drag(DragSource.java:306)
at org.eclipse.swt.dnd.DragSource.access$0(DragSource.java:277)
at org.eclipse.swt.dnd.DragSource$1.handleEvent(DragSource.java:164)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:928)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3348)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2968)
at src.test.open(test.java:52)
at src.test.main(test.java:37)
刚点击拖拽就出了上面那些异常,哪位懂得解释下原因。
下面是断源码:
package src;import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
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.FileTransfer;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;public class test { private Table dropTable;
private Tree dragTree;
protected Shell shell;
private TextTransfer textTransfer;
private FileTransfer fileTransfer; /**
* Launch the application
* @param args
*/
public static void main(String[] args) {
try {
test window = new test();
window.open();
} catch (Exception e) {
e.printStackTrace();
}
} /**
* Open the window
*/
public void open() {
final Display display = Display.getDefault();
createContents();
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
} /**
* Create contents of the window
*/
protected void createContents() {
shell = new Shell();
shell.setSize(500, 375);
shell.setText("SWT Application"); final SashForm sashForm = new SashForm(shell, SWT.NONE); dragTree = new Tree(sashForm, SWT.BORDER); DragSource source = new DragSource(dragTree, DND.DROP_MOVE
| DND.DROP_COPY);
source.setTransfer(new Transfer[] { textTransfer }); // 指定允许的传输类型
source.addDragListener(new MyDragSourceListener());
sashForm.setBounds(0, 0, 492, 341); dropTable = new Table(sashForm, SWT.BORDER);
dropTable.setLinesVisible(true);
dropTable.setHeaderVisible(true); DropTarget target = new DropTarget(dropTable, DND.DROP_MOVE
| DND.DROP_COPY | DND.DROP_DEFAULT);
target.setTransfer(new Transfer[] { textTransfer });
target.addDropListener(new MyDropTargetListener());
sashForm.setWeights(new int[] { 228, 261 });
textTransfer = TextTransfer.getInstance();
fileTransfer = FileTransfer.getInstance();
for (int i = 0; i < 10; i++) {
TreeItem item = new TreeItem(dragTree, SWT.NONE);
item.setText(" treeitem " + i);
for (int i2 = 0; i2 < 5; i2++) {
TreeItem subitem = new TreeItem(item, SWT.NONE);
subitem.setText(" subtreeitem " + i2);
}
}
for (int i = 0; i < 10; i++) {
TableItem item = new TableItem(dropTable, SWT.NONE);
item.setText(new String[] { " tableitem " + i, 100 + i + "" });
}
} class MyDragSourceListener implements DragSourceListener {
// 指定拖动开始的执行策略。
public void dragStart(DragSourceEvent event){
if (((DragSource)event.widget).getControl() instanceof Tree){
TreeItem selection = test. this .dragTree.getSelection()[ 0 ];
if (selection.getText().length() == 0 ){
event.doit = false ;
}
}
} // dragSetData方法在dragStart通过之后才被调用。这个方法可能会因为同一种传输类型多次set或
// 不同的多种传输类型的set而被多次调用,象windows等有些平台中,dropTarget可以在鼠标移动的
// 过程中请求数据,但是在Motif等平台中,只可以在drop操作完成之后才可以请求数据,所以在这个方
// 法中不要假设drag and drop操作已经完成.在这个方法中是无法知道data将被drop到哪里.
// set的Data也要符合指定的Transfer的format类型。
public void dragSetData(DragSourceEvent event){
if (TextTransfer.getInstance().isSupportedType(event.dataType)){
if (((DragSource)event.widget).getControl() instanceof Tree){
TreeItem selection = test. this .dragTree.getSelection()[ 0 ];
event.data = selection.getText();
}
}
} // 根据事先指定好的操作类型来处理操作结果
public void dragFinished(DragSourceEvent event){
if (event.detail == DND.DROP_MOVE){
if (((DragSource)event.widget).getControl() instanceof Tree){
TreeItem selection = test. this .dragTree.getSelection()[ 0 ];
selection.removeAll();
}
}
}
}class MyDropTargetListener implements DropTargetListener{
// dragEnter事件在drag and drop动作开始,并且鼠标进入了target widget的范围内时被调用。
public void dragEnter(DropTargetEvent event){
if (event.detail == DND.DROP_DEFAULT){
// 给event.detail赋的值必须是event.operations中的一个,event.operations中
// 的操作都是DragSource所支持的.
if ((event.operations & DND.DROP_COPY) != 0 ){
event.detail = DND.DROP_COPY;
} else {
event.detail = DND.DROP_NONE;
}
}
for ( int i = 0 ;i < event.dataTypes.length;i ++ ){
if (textTransfer.isSupportedType(event.dataTypes[i])){
event.currentDataType = event.dataTypes[i];
// 只允许COPY
if (event.detail != DND.DROP_COPY){
event.detail = DND.DROP_NONE;
}
break ;
}
}
}
public void dragOver(DropTargetEvent event){
event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
if (textTransfer.isSupportedType(event.currentDataType)){
String t = (String)(textTransfer.nativeToJava(event.currentDataType));
if (t != null ){
System.out.println(t);
}
}
} public void dragOperationChanged(DropTargetEvent event){
if (event.detail == DND.DROP_DEFAULT){
event.detail = DND.DROP_COPY;
} else {
event.detail = DND.DROP_NONE;
} // allow text to be moved but files should only be copied
if (fileTransfer.isSupportedType(event.currentDataType)){
if (event.detail != DND.DROP_COPY){
event.detail = DND.DROP_NONE;
}
}
}
public void dragLeave(DropTargetEvent event){
} public void dropAccept(DropTargetEvent event){
}
public void drop(DropTargetEvent event){
if (textTransfer.isSupportedType(event.currentDataType)){
String text = (String)event.data;
TableItem item = new TableItem(dropTable,SWT.NONE);
item.setText(text);
}
if (fileTransfer.isSupportedType(event.currentDataType)){
String[] files = (String[])event.data;
for ( int i = 0 ;i < files.length;i ++ ){
TableItem item = new TableItem(dropTable,SWT.NONE);
item.setText(files[i]);
}
}
}}
}
在createContents()方法中,把下面这行语句换个位置就行了
textTransfer = TextTransfer.getInstance();上面这句要出现在setTransfer()之前,你不妨就把这句作为createContents()的第一句语句。