2011-03-04 50 views
1

这是从OTN Discussions Forum转发,因为我没有得到答案。DropDemo中的ListTransferHandler有一个bug

在Java中,我想在包含字符串的JList中启用拖放操作。为此,我使用了Oracle的DropDemo中使用的ListTransferHandler.java。不幸的是,这个ListTransferHandler.java有一个错误。

要重现错误的ListTransferHandler.java我做了以下内容:

取而代之:

  • 清单项目1
  • 货品0

我得到这个:

  • 清单项目1
  • 清单项目1

这显然是不预期的结果。

Netbeans的输出窗口没有显示任何错误消息。我试图自己发现错误,但没有成功。

所以我错过了在JList中启用DnD的意义?我不需要自己实现一个ListTransferHandler吗?

有没有人为我工作ListTransferHandler请或知道如何解决在演示中使用的一个?

感谢和问候, 库尔特

回答

0

这肯定是一个错误。看看ListTransferHandler#清理方法。其目标是从列表中删除以前选择的项目。指数修正删除之前执行:

 if (addCount > 0) { 
      for (int i = 0; i < indices.length; i++) { 
       if (indices[i] > addIndex) { 
        indices[i] += addCount; 
       } 
      } 
     } 

不知何故,方法ListTransferHandler#importString初始化addCount不会被调用,因此,修正是永远做不完的。

作为一种解决办法,你可以自己初始化:

 int addCount = indices.length; 

这将解决INSERT放置模式。

UPD:

只注意到其它降模式太碎。所以,最后的修复(似乎是这样):

public class ListTransferHandler extends TransferHandler { 
    private boolean insert; 
    //........ 
    public boolean importData(TransferHandler.TransferSupport info) { 
     //...... 
     insert = dl.isInsert(); 
     //...... 

    protected void exportDone(JComponent c, Transferable data, int action) { 
     cleanup(c, insert && action == TransferHandler.MOVE); 
    } 

    protected void cleanup(JComponent c, boolean remove) { 
     if (remove && indices != null) { 
      int addCount = indices.length; 
     //..... 

} 

此外,应删除所有未使用的字段和方法。

+0

对于INSERT,布尔删除应该是假的,但它是真的。 – 2011-03-04 19:49:26

+0

_ @ StackOverflowException_只要'remove =(action == TransferHandler.MOVE)'实际插入仅在用户持有_Ctrl_时执行。 – n0weak 2011-03-04 20:13:06

0

@ n0weak感谢您的回答我可以修复ListTransferHandler以满足我的需求(多选仍然被打破,而且我还没有测试其他模式而不是INSERT)。

我发现有必要记住addIndex以及上面的解决方案。这里是我使用的代码更改:

public class ListTransferHandler extends TransferHandler { 
    // ... 
    private boolean insert; 
    // ... 

public boolean importData(TransferHandler.TransferSupport info) { 
     // ...    
     // method local variables were mistakenly used 
     insert = dl.isInsert(); 
     addIndex = dl.getIndex(); // also replace index with addIndex a few lines below 
     addCount = indices.length; 
     // ... 

protected void exportDone(JComponent c, Transferable data, int action) { 
     cleanup(c, insert && action == TransferHandler.MOVE); 
    } 

/* protected void importString(JComponent c, String str) {...} 
    This method is never called */