2012-12-26 4 views
2

J'essaye d'implémenter glisser & déposer dans Java avec deux JList instances. Le flux de base fonctionne correctement. Toutefois, lorsque je fais glisser une chaîne à partir d'une liste, je souhaite limiter la cible de dépôt uniquement pour la deuxième liste. J'ai remarqué que lorsque je glissais une chaîne d'une liste sur mon bureau, elle crée un fichier contenant cette chaîne.Activer drop juste pour des cibles spécifiques dans Swing

Y a-t-il un moyen d'éviter de telles situations?

public class SampleDnD extends JFrame{ 

    public static void main(String[] args) { 
     new SampleDnD(); 

    } 
    /** 
    * new form of frame sample contain 2 JLists with drag enabled. 
    */ 
    public SampleDnD(){ 
     JList l1 = new JList(); 
     JList l2 = new JList(); 
     JScrollPane jScrollPane1 = new javax.swing.JScrollPane(); 
     JScrollPane jScrollPane2 = new javax.swing.JScrollPane(); 
     DefaultListModel listModel1 = new DefaultListModel(); 
     DefaultListModel listModel2 = new DefaultListModel(); 

     String[] list1 = new String[]{"1","3","5","7","9"}; 
     String [] list2 = new String[]{"0","2","4","6","8"}; 
     for(int index=0;index<list1.length;index++){ 
      listModel1.add(index, list1[index]); 
      listModel2.add(index, list2[index]); 
     } 
     l1.setModel(listModel1); 
     l2.setModel(listModel2); 
     l1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     l2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     l1.setDropMode(DropMode.INSERT); 
     l1.setDragEnabled(true); 
     l2.setDragEnabled(true); 
     l1.setTransferHandler(new ListTransferHandler()); 
     l2.setDropMode(DropMode.INSERT); 
     l2.setTransferHandler(new ListTransferHandler()); 
     jScrollPane1.setViewportView(l1); 
     jScrollPane2.setViewportView(l2); 

     Container cp = getContentPane(); 
     cp.setLayout(new BoxLayout(cp,BoxLayout.Y_AXIS)); 
     setPreferredSize(new Dimension(800,500)); 
     getContentPane().add(jScrollPane1); 
     getContentPane().add(jScrollPane2); 
     setVisible(true); 
     pack(); 

    } 
    public class ListTransferHandler extends TransferHandler { 


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

     /** 
     * Bundle up the selected items in a single list for export. 
     * 
     */ 
     protected Transferable createTransferable(JComponent c) { 
      JList list = (JList)c; 
      String value = (String)list.getSelectedValue(); 
      return new StringSelection(value); 
     } 

     /** 
     * We support only move actions. 
     */ 
     public int getSourceActions(JComponent c) { 
      return TransferHandler.MOVE; 
     } 
     /** 
     * Perform the actual import. This demo only supports drag and drop. 
     */ 
     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; } 

      if (insert) { 
       listModel.add(index++, data); 
      } else { 
       // If the items go beyond the end of the current 
       // list, add them in. 
       if (index < listModel.getSize()) { 
        listModel.set(index++, data); 
       } else { 
        listModel.add(index++, data); 
       } 
      } 
      return true; 
     } 
     /** 
     * Remove the items moved from the list. 
     */ 
     protected void exportDone(JComponent c, Transferable data, int action) { 
      JList source = (JList)c; 
      DefaultListModel listModel = (DefaultListModel)source.getModel(); 
      if(action == TransferHandler.MOVE) 
      { 
       listModel.remove(source.getSelectedIndex()); 
      } 
     } 

    } 
} 
+0

Créez l'application. Plein écran et non redimensionnable? Pour une meilleure aide plus tôt, postez un [SSCCE] (http://sscce.org/). –

+0

Plein écran n'est pas une option. –

+1

Un SSCCE est-il une option? –

Répondre

0

Un peu plus tard, mais peut-être utile pour quelqu'un d'autre: Vous devez créer votre propre DatFlavor, qui ne sera acceptée par votre propre application.

DataFlavor myObjectDataFlavor = new DataFlavor(MyObject.class, "java/MyObject"); 

passe celui-ci au lieu d'un défaut DataFlavor.javaFileListFlavor ou DataFlavor.stringFlavor. Votre classe MyObject est un Pojo contenant uniquement une variable de classe de type String ou un entier ou tout ce dont vous avez besoin.

Questions connexes