Réorganisation de JList par glisser-déposer
J'ai rencontré un problème concernant la réorganisation des éléments dans une JList en utilisant le Glisser-Déposer. Le code suivant est une modification d'un code où vous pouvez faire glisser des éléments d'un JList à l'autre (qui a travaillé que d'une seule manière). J'ai essayé de le rendre utilisable pour une seule JList, mais les éléments ne peuvent même pas être traîné hors de la liste. Donc je suppose que ça ne peut pas être fait de cette façon. Les idées de ce que je fais mal ou de ne pas prendre en considération?
L'idée est de faire fonctionner une Jlist avec des vignettes, mais depuis je ne peux même pas l'obtenir pour travailler avec des chaînes... j'ai été à la recherche dans plusieurs d'n AVAIS tutoriels, mais je ne peux pas le faire fonctionner.
Toute aide est appréciée.
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.datatransfer.*;
import java.io.IOException;
public class DragAndDrop extends JFrame {
DefaultListModel<String> transport = new DefaultListModel<String>();
JList<String> transportList = new JList<String>(transport);
public DragAndDrop() {
setLayout(new FlowLayout());
transport.addElement("Bike");
transport.addElement("Car");
transport.addElement("Truck");
transport.addElement("Boat");
JScrollPane transportScroll = new JScrollPane(transportList);
transportScroll.setBorder(new TitledBorder("Transportation"));
add(transportScroll);
transportList.setDragEnabled(true);
transportList.setTransferHandler(new TransferHandler() {
int index;
@Override
public int getSourceActions(JComponent comp) {
return COPY_OR_MOVE;
}
@Override
public Transferable createTransferable(JComponent comp) {
index = transportList.getSelectedIndex();
return new StringSelection(transportList.getSelectedValue());
}
@Override
public void exportDone( JComponent comp, Transferable trans, int action ) {
if (action==MOVE) {
transport.remove(index);
}
}
});
transportList.setDropMode(DropMode.ON);
transportList.setTransferHandler(new TransferHandler() {
@Override
public boolean canImport(TransferHandler.TransferSupport support) {
//data of type string?
return support.isDataFlavorSupported(DataFlavor.stringFlavor);
}
@Override
public boolean importData(TransferHandler.TransferSupport support) {
try {
//convert data to string
String s = (String)support.getTransferable().getTransferData(DataFlavor.stringFlavor);
JList.DropLocation dl = (JList.DropLocation)support.getDropLocation();
transport.add(dl.getIndex(),s);
return true;
}
catch (UnsupportedFlavorException e) {}
catch (IOException e) {}
return false;
}
});
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new DragAndDrop();
}
}
PS. Désolé si cela s'avère être un re-post.
MODIFIER
Je pense que j'ai eu il fixe: a différents transferHandlers - ne devrait avoir qu'un avec toutes les méthodes de la seconde.
source d'informationauteur UserOrNotAnUser
Vous devez vous connecter pour publier un commentaire.
Voir le Baisse De Démonstration de la Balançoire tutoriel sur la défense nationale) pour un exemple qui va tomber sur le même JList ou d'une autre, JList.
Que l'OP a fait remarquer dans son édition à la question initiale, le problème dans l'exemple donné est qu'il y avait deux transfert des gestionnaires et comme camickr souligné à juste titre dans leur réponse, il y a un exemple dans les Tutoriels Java qui fonctionne.
Le problème avec l'exemple de la Java des Tutoriels, c'est que, lors de l'utilisation de
DropMode.INSERT
et de déplacement d'un élément dans le courantJList
à l'avant de l'index sélectionné, l'élément est dupliqué. Cela supprime un élément dans leJList
met une copie de l'élément à l'endroit que vous vouliez aller, et les feuilles de l'original de l'élément sélectionné comme il est.Donc, pour ceux que cela intéresse, voici un exemple qui résout ce problème basée sur la
JList<String>
exemple fourni dans le cas des OP question.