I have a JList and want the user to be able to reorder the elements in the list using drag-n-drop (using my own ListModel and ListCellRenderer, if that makes any difference). Which Objects do I need to create, and how do I process the action?
Modified Jan Taccis answer:
public class DndTest extends JFrame {
JList<String> myList;
DefaultListModel<String> myListModel;
public DndTest() {
myListModel = createStringListModel();
myList = new JList<String>(myListModel);
MyMouseAdaptor myMouseAdaptor = new MyMouseAdaptor();
myList.addMouseListener(myMouseAdaptor);
myList.addMouseMotionListener(myMouseAdaptor);
JPanel content = new JPanel();
content.add(myList);
this.add(content);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.setVisible(true);
}
private class MyMouseAdaptor extends MouseInputAdapter {
private boolean mouseDragging = false;
private int dragSourceIndex;
@Override
public void mousePressed(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
dragSourceIndex = myList.getSelectedIndex();
mouseDragging = true;
}
}
@Override
public void mouseReleased(MouseEvent e) {
mouseDragging = false;
}
@Override
public void mouseDragged(MouseEvent e) {
if (mouseDragging) {
int currentIndex = myList.locationToIndex(e.getPoint());
if (currentIndex != dragSourceIndex) {
int dragTargetIndex = myList.getSelectedIndex();
String dragElement = myListModel.get(dragSourceIndex);
myListModel.remove(dragSourceIndex);
myListModel.add(dragTargetIndex, dragElement);
dragSourceIndex = currentIndex;
}
}
}
}
private DefaultListModel<String> createStringListModel() {
final String[] listElements = new String[] { "Cat", "Dog", "Cow", "Horse", "Pig", "Monkey" };
DefaultListModel<String> listModel = new DefaultListModel<String>();
for (String element : listElements) {
listModel.addElement(element);
}
return listModel;
}
public static void main(String[] args) {
new DndTest();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With