IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Java Discussion :

Drag ans Drop entre deux JList


Sujet :

Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 44
    Par défaut Drag ans Drop entre deux JList
    Bonjour,

    Après avoir testé, retesté, fouillé et mangé un paquet de documentation (dont celle présente ici :http://java.sun.com/docs/books/tutor...dnd/index.html), je me retrouve encore à faire appel à votre aide.

    Je vais essayer de présenter au mieux mon soucis.

    J'ai deux JList (intitulées jlistSource et jlistDest) dont le contenu est stocké dans des Vector<File> externalisés (respectivements vectListSource et vectListDest).

    Le vecteur source est rempli par un listing d'un certain répertoire (Dans l'exemple tout en bas, "C:\Temp")

    Dans une problématique d'affichage, j'ai suivi la solution qui m'a été gracieusement fournie par Uther sur ce post (http://www.developpez.net/forums/d84...s/#post4846331) qui consiste à créer une classe Filenamed qui hérite de File et qui modifie le comportement du ToString().

    De manière simplifiée, je veux pouvoir remplir le vecteur de destination (qui correspond à une sélection de fichiers de la liste de source dans un certain ordre).
    Et là, le bât blesse : la solution proposée à mes futurs utilisateurs ne leur convient pas (un bouton qui lit la sélection de la liste source et transfère les éléments correspondants dans le vecteur de destination, éléments qui sont donc affichés dans la liste de destination).
    Il veulent un Drag and Drop, qui permette aussi de réorganiser entre eux les éléments de la liste de destination.

    Irrité de leur feignantise en clics, je sors me mettre la tête dans la neige pour me calmer et étudie la question. Je trouve le tuto de Sun sur le Drag and Drop et je tente de faire un TransferHandler personnalisé.

    Et là, je retourne me mettre la tête dans la neige.....

    Je réussis à faire un truc dans le genre, mais avec des String dans les vecteurs. Truffé de bug (lors du DnD de plusieurs éléments, il rajoute la concaténation du tout ....), je me lance toutefois dans la création.
    Sur le modèle du tuto de Sun, je crée un DataFlavor pour les éléments File, je vérifie tout bien, mais rien...

    Je vous met mon code, qui doit être horrible à voir (noter que ce qui est relatif à la source est 1 et destination est 2):

    • -Les vecteurs de "contrôle" des listes :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      public static Vector<File> vList1 = new Vector<File>();
      	public static Vector<File> vList2 = new Vector<File>();
    • -Les ListModel :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      public ListModel test1 = new AbstractListModel() {
      		/**
                       * 
                       */
      		private static final long serialVersionUID = 1L;
       
       
      		@Override
      		public int getSize() {
      			return vList1.size();
      		}
       
      		@Override
      		public Object getElementAt(int index) {
      			return new FileNamed(vList1.get(index));
      		}
      	};
      	public ListModel test2 = new AbstractListModel() {
      		/**
                       * 
                       */
      		private static final long serialVersionUID = 1L;
       
       
      		@Override
      		public int getSize() {
      			return vList2.size();
      		}
       
      		@Override
      		public Object getElementAt(int index) {
      			return new FileNamed(vList2.get(index));
      		}
      	};
    • -La classe FileNamed :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      import java.io.File;
       
       
      public class FileNamed extends File {
      	/**
               * 
               */
      	private static final long serialVersionUID = 1L;
       
      	public FileNamed(File f){
      		super(f.getPath());
      	}
      	@Override
          public String toString() {
              return getName().substring(0,getName().lastIndexOf("."));
          }
      }
    • -Le run() qui est appellé dans le main :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      public void run() {
      		frame1.setVisible(true);
      		refresh();
      		list1.setModel(test1);
      		list2.setModel(test2);
      		list2.setTransferHandler(new TransferHandler() {
       
      			private static final long serialVersionUID = 1L;
       
      			public boolean canImport(TransferHandler.TransferSupport info) {
      				// we only import Files
      				if (!info.isDataFlavorSupported(new DataFlavor(File.class,"File"))) {
      					return false;
      				}
       
      				JList.DropLocation dl = (JList.DropLocation)info.getDropLocation();
      				if (dl.getIndex() == -1) {
      					return false;
      				}
      				return true;
      			}
       
      			public boolean importData(TransferHandler.TransferSupport info) {
      				if (!info.isDrop()) {
      					return false;
      				}
       
      				//	                 Check for File flavor
      				if (!info.isDataFlavorSupported(new DataFlavor(File.class,"File"))) {
      					displayDropLocation("List doesn't accept a drop of this type.");
      					return false;
      				}
       
      				JList.DropLocation dl = (JList.DropLocation)info.getDropLocation();
      				int index = dl.getIndex();
      				boolean insert = dl.isInsert();
      				// Get the current string under the drop.
       
      				// Get the string that is being dropped.
      				Transferable t = info.getTransferable();
      				File data;
      				try {
      					data = (File)t.getTransferData(new DataFlavor(File.class,"File"));
      				} 
      				catch (Exception e) { return false; }
       
      				// Perform the actual import.  
      				if (insert) {
      					vList2.add(data);
      					//	                    
      				} else {
      					vList2.add(index,data);	                 
      				}
      				return true;
      			}
       
      			public int getSourceActions(JComponent c) {
      				return COPY;
      			}
       
      			protected Transferable createTransferable(JComponent c) {
      				JList list1 = (JList)c;
      				Object[] values = list1.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 new StringSelection(buff.toString());
      			}
      		});
       
      	}
    • - L,initialisation du vecteur source (liste de fichiers) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      public void refresh(){
      		//Lister les fichiers et les mettre dans le vecteur source (appellé un seule fois seulement)
      		File tmpFolder = new File("C:\\Temp");
      		File[] ls = tmpFolder.listFiles();
      		for(int i=0;i<ls.length;i++){
      			vList1.add(ls[i]);
      		}
      	}
    • -Et enfin un buton pour raffraichir le tout :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      private void button2MouseClicked(MouseEvent e) {
      		list1.setModel(test1);
      		list2.setModel(test2);
      	}


    N'hésitez pas à me demander des informations supplémentaires. Mais soyez indulgents, je débute

    Merci d'avance !!!

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 44
    Par défaut
    Petit up... je suis vraiment embêté. Même des pistes seraient grandement appréciées

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 121
    Par défaut
    Il y a quelques petites retouches à faire

    * Dans ton TransferHandler
    createTransferable produit des StringSelection
    mais
    canImport accepte des fichiers transférables (DataFlavor(File.class,"File")) et non pas des String

    Donc dans createTransferable tu dois créer des fichiers transférables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    protected Transferable createTransferable(JComponent c) {
    	JList list1 = (JList)c;
    	final Object[] values = list1.getSelectedValues();
     
    	return new Transferable(){ 
     
    	   @Override
    	   public Object getTransferData(DataFlavor flavor)
    	   throws UnsupportedFlavorException, IOException {
    		if (values.length>0)
    			return values[0];
    		else
    			return null;
    	   }
     
    	   @Override
    	   public DataFlavor[] getTransferDataFlavors() {
    		return new DataFlavor[]{new DataFlavor(File.class,"File")};
    	   }
     
    	   @Override
    	   public boolean isDataFlavorSupported(DataFlavor flavor) {
    		return flavor.match(new DataFlavor(File.class,"File"));
    	   }
    	};
    }
    * Pour que ton drag&drop marche correctement tu dois activer certaines options. De plus list1 et list2 partagent le même transferHandler

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    		list1.setModel(test1);
    		list1.setDragEnabled(true); // <<<<<<< 
    		list1.setTransferHandler(transferHandler); // <<<<<<
     
    		list2.setModel(test2);
    		list2.setDropMode(DropMode.ON_OR_INSERT); //<<<<<<<<<
    		list2.setTransferHandler(transferHandler);
    * Avec ces deux modif. le drag&drop de list1 vers list2 fonctionne mais la JList list2 ne se rafraichi pas automatiquement.
    Tu dois mettre à jour ton vecteur de Fichier via ton ListModel

    Dans l'interface de transfert...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public boolean importData(TransferHandler.TransferSupport info) {
    	....
    	// Perform the actual import.
    	JList target=(JList)info.getComponent(); // <<<<<<< list2
    	FileListModel dataModel=(FileListModel)target.getModel(); // <<<<<<  test2
    	if (insert) {
    		//vList2.add(data); <<<<<<<<<<<<<<
    		dataModel.add(data);                    
    	} else {
    		//vList2.add(index,data); <<<<<<<<<<<<<<<<<<<
    		dataModel.add(index,data);
    	}			
    	return true;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	private FileListModel test1=new FileListModel(new File("C:\\Temp"));
    	private FileListModel test2=new FileListModel();
    	private JList list1=new JList(test1);
    	private JList list2=new JList(test2);
    En déclarant FileListModel comme suit...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    public class FileListModel extends AbstractListModel {
    	private static final long serialVersionUID = 1L;
     
    	private List<File> fileList; // <<<< Données encapsulées dans 
     
    	public FileListModel() {
    		fileList=new Vector<File>();
    	}
     
    	public FileListModel(File folder) {
    		refresh(folder);
    	}
     
    	public FileListModel(List<File> fileList) {
    		this.fileList = fileList;
    	}
     
    	public boolean add(File data) {
    		if (fileList.add(data)) {
    			fireIntervalAdded(this, fileList.size()-1, fileList.size()-1); // <<<<< Notifier la GUI de se mettre à jour
    			return true;
    		}
    		return false;
    	}
     
    	public void add(int index,File data) {
    		fileList.add(index,data);
    		fireIntervalAdded(this, index, index); // <<<<< Notifier la GUI de se mettre à jour
    	}
     
    	@Override
    	public int getSize() {
    		return fileList.size();
    	}
     
    	@Override
    	public Object getElementAt(int index) {
    		return new FileNamed(fileList.get(index));
    	}
     
    	private void refresh(File path){
    		//Lister les fichiers et les mettre dans le vecteur source (appellé un seule fois seulement)
    		this.fileList=new Vector<File>();
    		File[] ls = path.listFiles();
    		for(int i=0;i<ls.length;i++){
    			fileList.add(ls[i]);
    		}
    		if (ls.length>0) fireContentsChanged(this, 0, ls.length-1);
    	}
    };
    J'espère que çà va te mettre sur la voie...A+

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 44
    Par défaut
    Je teste ca dès demain, mais je te remercie vraiment d'avoir pris le temps de me répondre !

    Merci encore !

    edit : ca marche à la perfection ! Je vais maintenant m'atteller à la compréhension de tout ca !
    Merci infinimient !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA-E]drag and drop entre deux listbox
    Par Yolak dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 14/06/2012, 14h37
  2. Drag and drop entre deux Liste BOX
    Par simoinfonet dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/04/2008, 17h39
  3. Drag and drop entre deux ListBox
    Par simoinfonet dans le forum Langage
    Réponses: 0
    Dernier message: 18/04/2008, 18h53
  4. Drag and Drop entre deux list view
    Par mkaffel dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/10/2007, 21h52
  5. [FLASH MX2004] Drag and drop entre deux List
    Par aldo-tlse dans le forum Flash
    Réponses: 15
    Dernier message: 24/09/2005, 01h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo