Я добавил к одному из JLists в моей программе java перегрузку перетаскивания. Я добавил метод к этому JList, чтобы иметь хороший эффект призрачного изображения выбранных значений, которые я перетаскиваю. Этот эффект работает прекрасно, пока я не добавить обработчик передачи:Перетаскивание объектов из JList с эффектом изображения призрака
В этом случае, этот метод:
myList.addMouseMotionListener(new MouseAdapter() {
public void mouseDragged(MouseEvent evt) {
System.out.println("Dragging");
}
});
от:
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.event.*;
import java.io.IOException;
import java.util.ArrayList;
import javax.activation.ActivationDataFlavor;
import javax.activation.DataHandler;
import javax.swing.*;
class ListExample extends JFrame
{
private JPanel topPanel;
private JList myList;
public ListExample()
{
setSize(300, 100);
topPanel = new JPanel();
topPanel.setLayout(new BorderLayout());
getContentPane().add(topPanel);
String listData[] =
{
"Item 1",
"Item 2",
"Item 3",
"Item 4"
};
myList = new JList(listData);
myList.setDragEnabled(true);
ListItemTransferHandler handler = new ListItemTransferHandler();
myList.setTransferHandler(handler);
topPanel.add(myList, BorderLayout.CENTER);
myList.addMouseMotionListener(new MouseAdapter() {
public void mouseDragged(MouseEvent evt) {
System.out.println("Dragging");
}
});
}
public static void main(String args[])
{
ListExample mainFrame = new ListExample();
mainFrame.setVisible(true);
}
class ListItemTransferHandler extends TransferHandler {
private final DataFlavor localObjectFlavor;
private Object[] transferedObjects = null;
public ListItemTransferHandler() {
localObjectFlavor = new ActivationDataFlavor(Object[].class, DataFlavor.javaJVMLocalObjectMimeType, "Array of items");
}
private JList source = null;
@SuppressWarnings("deprecation")
@Override protected Transferable createTransferable(JComponent c) {
source = (JList) c;
transferedObjects = source.getSelectedValues();
return new DataHandler(transferedObjects, localObjectFlavor.getMimeType());
}
@Override public boolean canImport(TransferSupport info) {
return true;
}
@Override public int getSourceActions(JComponent c) {
return MOVE; //TransferHandler.COPY_OR_MOVE;
}
}
}
вызывается один или два раза, как я начинаю тянуть, но как только я получаю несколько пикселей, выбор источника меняет цвет, и мой прослушиватель перетаскивания больше не вызывается, а изображение-призрак остается рядом с источником перетаскиваемого объекта. Однако я все еще могу перетащить выделенные ячейки и сбросить их туда, где я хочу. Просто призрачное изображение не следует полностью. Мне явно не хватает чего-то важного здесь, но поскольку это довольно специфическая проблема, я нигде не мог найти помощь, поэтому предложения будут оценены.
Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –
Это может быть конкретное поведение (изображение-призрак) для вашей ОС, но не стандартная функция Java. Обычно для создания такого эффекта вам нужно будет сделать много дополнительного кодирования и приложить некоторые усилия в этом ... –
Как это происходит, эта функция не поддерживается в Windows, и именно поэтому я хотел бы сделать ее индивидуальной. –