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 !!!
Partager