Code
class ListPopupMenu extends JPopupMenu {
private final JMenuItem cutItem;
private final JMenuItem copyItem;
protected ListPopupMenu(JList list) {
super();
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
TransferHandler handler = list.getTransferHandler();
cutItem = add("cut");
cutItem.addActionListener(e -> {
handler.exportToClipboard(list, clipboard, TransferHandler.MOVE);
});
copyItem = add("copy");
copyItem.addActionListener(e -> {
handler.exportToClipboard(list, clipboard, TransferHandler.COPY);
});
add("paste").addActionListener(e -> {
handler.importData(list, clipboard.getContents(null));
});
addSeparator();
add("clearSelection").addActionListener(e -> list.clearSelection());
}
@Override public void show(Component c, int x, int y) {
if (c instanceof JList) {
boolean isSelected = !((JList) c).isSelectionEmpty();
cutItem.setEnabled(isSelected);
copyItem.setEnabled(isSelected);
super.show(c, x, y);
}
}
}
// ...
private static int getIndex(TransferHandler.TransferSupport info) {
JList target = (JList) info.getComponent();
int index; // = dl.getIndex();
if (info.isDrop()) { // Mouse Drag & Drop
System.out.println("Mouse Drag & Drop");
TransferHandler.DropLocation tdl = info.getDropLocation();
if (tdl instanceof JList.DropLocation) {
index = ((JList.DropLocation) tdl).getIndex();
} else {
index = target.getSelectedIndex();
}
} else { // Keyboard Copy & Paste
index = target.getSelectedIndex();
}
DefaultListModel listModel = (DefaultListModel) target.getModel();
// boolean insert = dl.isInsert();
int max = listModel.getSize();
// int index = dl.getIndex();
index = index < 0 ? max : index; // If it is out of range, it is appended to the end
index = Math.min(index, max);
return index;
}
References