【问题标题】:Drag objects from JList, with ghost image effect从 JList 中拖动对象,具有幻像效果
【发布时间】:2013-04-26 14:26:43
【问题描述】:

我在我的 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;
    }



}
}

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

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 这可能是您的操作系统的特定行为(幻像),但不是标准的 Java 功能。通常要创建这样的效果,你必须做很多额外的编码并付出一些努力......
  • 碰巧这个功能在 Windows 中不受支持,这就是为什么我想定制一个。

标签: java swing jlist drag-and-drop


【解决方案1】:

DragGestureListener 在启动拖放过程时优先于 MouseMotionListener。这你必须实现这样的 DragGestureListener。 请参阅此处以获取一个很好的工作示例。 Java drag and drop custom cursor

【讨论】:

    猜你喜欢
    • 2020-07-28
    • 2012-09-03
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    相关资源
    最近更新 更多