2012-09-24 3 views
2

(Oracle 사이트의 예제에 따라) 애플리케이션 용 TransferHandler를 작성했지만 데이터를 이동할 때 이동하지 않습니다. 인덱스 n (즉, 이동하고 항목을 n 위치로 이동하는 경우)에서 인덱스 n으로 데이터를 복사하는 것뿐입니다. 많은 옵션을 시도했지만 그들 중 누구도 저를 위해 일하고 있습니다.JList의 드래그 앤 드롭이 작동하지 않습니다.

import javax.swing.TransferHandler; 
import javax.swing.*; 
import java.awt.datatransfer.*; 

    public class ListTransferHandler extends TransferHandler { 
     private int[] indices = null; 
     private int addIndex = -1; //Location where items were added 
     private int addCount = 0; //Number of items added. 

     public boolean canImport(TransferHandler.TransferSupport info) { 
      // Check for String flavor 
      if (!info.isDataFlavorSupported(DataFlavor.stringFlavor)) { 
       return false; 
      } 
      return true; 
     } 

     protected Transferable createTransferable(JComponent c) { 
      return new StringSelection(exportString(c)); 
     } 

     public int getSourceActions(JComponent c) { 
      return TransferHandler.MOVE; 
     } 

     public boolean importData(TransferHandler.TransferSupport info) { 
      if (!info.isDrop()) { 
       return false; 
      } 

      JList list = (JList)info.getComponent(); 
      DefaultListModel listModel = (DefaultListModel)list.getModel(); 
      JList.DropLocation dl = (JList.DropLocation)info.getDropLocation(); 
      int index = dl.getIndex(); 
      boolean insert = dl.isInsert(); 

      // Get the string that is being dropped. 
      Transferable t = info.getTransferable(); 
      String data; 
      try { 
       data = (String)t.getTransferData(DataFlavor.stringFlavor); 
      } 
      catch (Exception e) { return false; } 

      // Perform the actual import. 
      if (insert) { 
       listModel.add(index, data); 
      } else { 
       listModel.set(index, data); 
      } 
      return true; 
     } 

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

     //Bundle up the selected items in the list 
     //as a single string, for export. 
     protected String exportString(JComponent c) { 
      JList list = (JList)c; 
      indices = list.getSelectedIndices(); 
      Object[] values = list.getSelectedValues(); 

      StringBuffer buff = new StringBuffer(); 

      for (int i = 0; i < values.length; i++) { 
       Object val = values[i]; 
       buff.append(val == null ? "" : val.toString()); 
       if (i != values.length - 1) { 
        buff.append("\n"); 
       } 
      } 

      return buff.toString(); 
     } 

     //Take the incoming string and wherever there is a 
     //newline, break it into a separate item in the list. 
     protected void importString(JComponent c, String str) { 
      JList target = (JList)c; 
      DefaultListModel listModel = (DefaultListModel)target.getModel(); 
      int index = target.getSelectedIndex(); 

      //Prevent the user from dropping data back on itself. 
      //For example, if the user is moving items #4,#5,#6 and #7 and 
      //attempts to insert the items after item #5, this would 
      //be problematic when removing the original items. 
      //So this is not allowed. 
      if (indices != null && index >= indices[0] - 1 && 
        index <= indices[indices.length - 1]) { 
       indices = null; 
       return; 
      } 

      int max = listModel.getSize(); 
      if (index < 0) { 
       index = max; 
      } else { 
       index++; 
       if (index > max) { 
        index = max; 
       } 
      } 
      addIndex = index; 
      String[] values = str.split("\n"); 
      addCount = values.length; 
      for (int i = 0; i < values.length; i++) { 
       listModel.add(index++, values[i]); 
      } 
     } 

     //If the remove argument is true, the drop has been 
     //successful and it's time to remove the selected items 
     //from the list. If the remove argument is false, it 
     //was a Copy operation and the original list is left 
     //intact. 
     protected void cleanup(JComponent c, boolean remove) { 
      if (remove && indices != null) { 
       JList source = (JList)c; 
       DefaultListModel model = (DefaultListModel)source.getModel(); 
       //If we are moving items around in the same list, we 
       //need to adjust the indices accordingly, since those 
       //after the insertion point have moved. 
       if (addCount > 0) { 
        for (int i = 0; i < indices.length; i++) { 
         if (indices[i] > addIndex) { 
          indices[i] += addCount; 
         } 
        } 
       } 
       for (int i = indices.length - 1; i >= 0; i--) { 
        model.remove(indices[i]); 
       } 
      } 
      indices = null; 
      addCount = 0; 
      addIndex = -1; 
     } 
} 

답변

2

내보내기가 성공적으로 완료되면 소스에서 데이터를 "제거"해야합니다.

이렇게하려면 TransferHandler.exportDone 메서드를 재정의해야합니다.

보호 공간으로 exportDone 데이터를 반출 한 후 호출 (JComponent의 소스 양도 데이터 INT 동작)

. 이 방법은 동작이 MOVE 인 경우 전송 된 데이터를 제거해야합니다.

MOVE가 MOVE를 포함하지 않는이 구현의 동작이 아니기 때문에이 메서드는 아무 작업도 수행하지 않기 위해 구현됩니다.

는 기본적으로, 거기에서 당신은 action 유형을 확인하고 대상 구성 요소 '는 MOVE와 단순히 COPY을 받아 그것을 에드했다 있는지 확인하고 소스 목록에서 요소를 제거해야합니다.

관련 문제