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]);
           }
       }
   }}
}

解决方案 »

  1.   

    我运行了你的程序,没有异常出现,只是不能拖,只要改一个地方就可以拖了。
    在createContents()方法中,把下面这行语句换个位置就行了
    textTransfer = TextTransfer.getInstance();上面这句要出现在setTransfer()之前,你不妨就把这句作为createContents()的第一句语句。