Ho riscontrato un problema relativo al riordino di elementi in una JList mediante trascinamento della selezione. Questo codice seguente è una modifica di un codice in cui è possibile trascinare elementi da una JList a un'altra (ha funzionato solo in un modo). Ho provato a renderlo utilizzabile per una sola JList, ma gli elementi non possono nemmeno essere trascinati fuori dalla lista. Quindi immagino che non possa essere fatto in questo modo. Qualche idea su cosa sto sbagliando o non prendendo in considerazione?Riordino di JList con trascinamento della selezione
L'idea è farla funzionare per una Jlist con le anteprime, ma dato che non riesco nemmeno a farlo funzionare con le sole stringhe ... Ho esaminato diversi tutorial di D'n'D, ma ancora Non riesco a farlo funzionare. Qualsiasi aiuto è apprezzato.
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. Scusa se questo risulta essere un nuovo post.
EDIT Penso che ho avuto è fisso: doveva diversi transferHandlers - dovrebbe avere una sola con tutti i metodi del secondo uno pure.
* "ma poiché non riesco nemmeno a farlo funzionare con le sole stringhe" * +1 per provarlo nella forma più semplice 1st. Non smette mai di stupirmi quando le persone arrivano qui con 200+ LOC contenenti un sacco di irrilevanti cruft. –