Since DefaultListModel does not have a move method like DefaultTableModel#moveRow(int start, int end, int to), the DefaultListModel#get(int index), DefaultListModel#remove(int index), and DefaultListModel#add(int index, E element) methods are used in combination to move selected items up and down the JList
.
Code
JButton up = new JButton("▲");
up.setFocusable(false);
up.addActionListener(e -> {
int[] pos = list.getSelectedIndices();
if (pos.length == 0) {
return;
}
boolean isShiftDown = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;
int index0 = isShiftDown ? 0 : Math.max(0, pos[0] - 1);
int idx = index0;
for (int i : pos) {
model.add(idx, model.remove(i));
list.addSelectionInterval(idx, idx);
idx++;
}
// scroll
Rectangle r = list.getCellBounds(index0, index0 + pos.length);
list.scrollRectToVisible(r);
});
JButton down = new JButton("▼");
down.setFocusable(false);
down.addActionListener(e -> {
int[] pos = list.getSelectedIndices();
if (pos.length == 0) {
return;
}
boolean isShiftDown = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;
int max = model.getSize();
int index = isShiftDown ? max : Math.min(max, pos[pos.length - 1] + 1);
int index0 = index;
// copy
for (int i : pos) {
int idx = Math.min(model.getSize(), ++index);
model.add(idx, model.get(i));
list.addSelectionInterval(idx, idx);
}
// clean
for (int i = pos.length - 1; i >= 0; i--) {
model.remove(pos[i]);
}
// scroll
Rectangle r = list.getCellBounds(index0 - pos.length, index0);
list.scrollRectToVisible(r);
});