【问题标题】:Is there any way to reach drop moment in Drag and Drop?有没有办法在拖放中达到下降时刻?
【发布时间】:2012-02-03 12:29:09
【问题描述】:

我正在制作一个 java 小程序,它可以通过拖放将文件从网站传输到我的桌面。我可以工作,但是,有什么方法可以了解何时开始拖放?我正在使用 MouseListener 来列出鼠标动作并使用我的 transferhandler用于传输数据的类。

下面这样的代码..

public class DragApplet extends JApplet
{       
    public void init()
    {       
        Container contentPane = getContentPane();

        Image image = ...;
        JLabel label = new JLabel(new ImageIcon(image));
        label.setTransferHandler(new ImageSelection());

        MouseListener listener = new MouseAdapter() 
        {
            public void mousePressed(MouseEvent me) {

                    JComponent comp = (JComponent) me.getSource();
                    TransferHandler handler = comp.getTransferHandler();
                    handler.exportAsDrag(comp, me, TransferHandler.COPY);
            }
        }       
        label.addMouseListener(listener);
        contentPane.add(label,BorderLayout.CENTER);
    }
}

class ImageSelection extends TransferHandler implements Transferable 
{
    private static final DataFlavor flavors[] = { DataFlavor.javaFileListFlavor };

    public ImageSelection(){ // bla bla.. }

    public int getSourceActions(JComponent c) {
        // bla bla..
        return TransferHandler.COPY;
    }     

    public Transferable createTransferable(JComponent comp) {
        // bla bla..
        return this;
    }

    public DataFlavor[] getTransferDataFlavors() {
        // bla bla..      
        return flavors;
    }

    public boolean canImport(JComponent comp, DataFlavor flavor[]) {
        // bla bla..
        return true;
    }    

    public Object getTransferData(DataFlavor flavor){   
        //Download starts and save "C:\\Temp\\aa.mpg" here..
        String[] ary= {"C:\\Temp\\aa.mpg\\"};           
        return Arrays.asList(ary);              
    }     

    public boolean importData(JComponent comp, Transferable t) {
        // bla bla..
        return false;
    }    

    public boolean isDataFlavorSupported(DataFlavor flavor) {
        // bla bla..
        return true;
    }
}

【问题讨论】:

  • 你想实现什么功能?
  • 我在我的 TransferHandler 类上实现了 Transferable。鼠标监听器创建了一些方法,如 mousepressed、mousereleased..
  • 那应该是“你试图实现什么功能?”,但你的评论完全没有告诉我。这样想吧。这是您用来说服潜在最终用户选择您的应用程序的功能。超过另一个。向我解释该功能,就像向最终用户解释一样 - 请注意,如果您对最终用户说您刚刚写给我的内容,他们将不知道您在说什么。那么再次,功能是什么?
  • 我的小程序允许从网站拖放到最终用户的放置目标(在文件夹或桌面中)。当最终用户在小程序上按下鼠标时,下载立即开始。我想在拖放开始时开始下载,而不是第一次点击鼠标。
  • 好的,谢谢。可以总结为“在drop动作之前不会浪费任何下载”?这足以让我理解这个问题。 OTOH 我不太相信你的描述。为什么 JRE 会在资源被丢弃之前开始下载资源?也许更熟悉 D'n'D 的人可以支持您的观察。 (老实说,现在我明白了这个问题,它让我确信我没有足够的经验来提供帮助。我希望有一些 D'n'D 大师路过并对你的问题感兴趣。 )

标签: java swing drag-and-drop applet


【解决方案1】:

我不知道您是如何创建 Transferable 的,因为它不包含在问题中。在拖放过程中,只要您开始拖动,就会创建 Transferable。但是,无需在 Transferable 的构造函数中开始下载。

当针对特定的DataFlavor调用Transferable#getTransferData方法时就可以开始下载了,也就是说,除非DropTarget实现不好,只有在drop发生时才调用。

【讨论】:

  • 我已经编辑了我的问题并显示了我的代码。如果您不忙,请查看代码并帮助我解决问题。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 2012-07-18
相关资源
最近更新 更多