从JList中拖动对象,具有鬼影效果



我在java程序中的一个JLists中添加了一个拖放传输处理程序。我为这个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;
    }

}
}

在我开始拖动时被调用一到两次,但一旦我离开了几个像素,源选择就会改变颜色,我的拖拽鼠标侦听器不再被调用,并且幽灵图像停留在被拖动对象的源附近。但是,我仍然可以拖动选定的单元格并将它们放在我想要的位置。只是鬼魂的形象并没有一直跟随。我显然在这里遗漏了一些重要的东西,但由于这是一个相当具体的问题,我无法在任何地方找到帮助,所以建议将不胜感激。

当拖放过程启动时,DragGestureListener优先于MouseMotionListener。你需要实现这样一个DragGestureListener。这里有一个很好的工作示例。Java拖放自定义光标

最新更新