У меня возникла проблема с переупорядочиванием элементов в JList с помощью Drag and Drop. Этот следующий код является модификацией кода, в котором вы могли бы перетаскивать элементы из одного JList в другой (работали только одним способом). Я пытался сделать его пригодным для использования только для одного JList, но элементы даже не могут быть вытащены из списка. Поэтому я думаю, что это невозможно. Любые идеи, что я делаю неправильно или не принимаю во внимание?Переупорядочение JList с перетаскиванием
Идея состоит в том, чтобы заставить его работать с Jlist с эскизами, но поскольку я даже не могу заставить его работать с целыми строками ... Я изучал несколько учебников D'n'D, но все же Я не могу заставить его работать. Любая помощь приветствуется.
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. Извините, если это окажется повторной отправкой.
EDIT Я думаю, что я получил это исправлено: было разным transferHandlers - должен иметь только один со всеми методами из второго, а также.
* "но так как я даже не могу заставить его работать только с строками" * +1, попробовав его в более простой форме. Никогда не перестаешь удивлять меня, когда люди появляются здесь с 200+ LOC, содержащими множество нерелевантных трещин. –