Zmiana kolejności JList za pomocą Drag and Drop
Napotkałem problem dotyczący zmiany kolejności elementów w liście JList przy użyciu metody przeciągnij i upuść. Poniższy kod jest modyfikacją kodu, w którym można przeciągać elementy z jednej listy JList do innej (działa tylko w jedną stronę). Próbowałem go używać tylko dla jednego JList, ale elementów nie można nawet przeciągnąć z listy. Więc chyba nie da się tego zrobić w ten sposób. Jakieś pomysły, co robię źle lub nie biorę pod uwagę?
Chodzi o to, aby działał dla Jlisty z miniaturami, ale ponieważ nie mogę nawet uruchomić go z napisami ... Szukałem kilku samouczków D'n'D, ale wciąż nie mogę zabierz to do pracy. Każda pomoc jest doceniana.
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. Przepraszamy, jeśli okaże się, że jest to ponowny post.
EDYTOWAĆ Myślę, że udało mi się to naprawić: musiałem do różnych transferHandlers - powinien mieć tylko jeden ze wszystkimi metodami z drugiej.