Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将文本从Java拖放到web浏览器_Java_Swing_Drag And Drop - Fatal编程技术网

将文本从Java拖放到web浏览器

将文本从Java拖放到web浏览器,java,swing,drag-and-drop,Java,Swing,Drag And Drop,我想让一个JavaSwing标签(包含文本)可以拖动,这样就可以将它放到浏览器窗口中(js侦听器在其中拾取文本)。使其可拖动很容易,但如何将其转移到浏览器窗口 我一直在搜索关于这方面的文档,但我发现的大部分内容都是很久以前(1999年)的: 以下是一个小示例,说明如何扩展TransferHandler,将文本从JLabel(或任何其他组件)拖动到其他正在运行的应用程序中: import javax.swing.*; import java.awt.datatransfer.StringSelec

我想让一个JavaSwing标签(包含文本)可以拖动,这样就可以将它放到浏览器窗口中(js侦听器在其中拾取文本)。使其可拖动很容易,但如何将其转移到浏览器窗口

我一直在搜索关于这方面的文档,但我发现的大部分内容都是很久以前(1999年)的:


以下是一个小示例,说明如何扩展
TransferHandler
,将文本从
JLabel
(或任何其他组件)拖动到其他正在运行的应用程序中:

import javax.swing.*;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

/**
 * @author Mikle Garin
 * @see https://stackoverflow.com/questions/45437809/drag-and-drop-text-from-java-to-web-browser
 */

public class TextDragHandler extends TransferHandler implements MouseListener, MouseMotionListener
{
    /**
     * Drag source component.
     */
    private final JComponent component;

    /**
     * Text to drag.
     */
    private final String text;

    /**
     * Whether or not drag was armed.
     * This flag is used to avoid multiple export operations.
     */
    private boolean armed;

    /**
     * Constructs new {@link TextDragHandler}.
     *
     * @param component drag source component
     * @param text      text to drag
     */
    public TextDragHandler ( final JComponent component, final String text )
    {
        super ();
        this.armed = false;
        this.text = text;
        this.component = component;
        this.component.addMouseListener ( this );
        this.component.addMouseMotionListener ( this );
    }

    @Override
    public void mouseClicked ( final MouseEvent e )
    {
        // Do nothing
    }

    @Override
    public void mousePressed ( final MouseEvent e )
    {
        if ( component.isEnabled () && SwingUtilities.isLeftMouseButton ( e ) )
        {
            armed = true;
        }
    }

    @Override
    public void mouseReleased ( final MouseEvent e )
    {
        if ( SwingUtilities.isLeftMouseButton ( e ) )
        {
            armed = false;
        }
    }

    @Override
    public void mouseEntered ( final MouseEvent e )
    {
        // Do nothing
    }

    @Override
    public void mouseExited ( final MouseEvent e )
    {
        // Do nothing
    }

    @Override
    public void mouseMoved ( final MouseEvent e )
    {
        // Do nothing
    }

    @Override
    public void mouseDragged ( final MouseEvent e )
    {
        if ( armed )
        {
            exportAsDrag ( component, e, getSourceActions ( component ) );
            armed = false;
        }
    }

    @Override
    public int getSourceActions ( final JComponent c )
    {
        return COPY;
    }

    @Override
    protected Transferable createTransferable ( final JComponent c )
    {
        return new StringSelection ( text );
    }

    /**
     * Sample {@link TextDragHandler} usage.
     *
     * @param args run arguments
     */
    public static void main ( final String[] args )
    {
        final JFrame frame = new JFrame ( "Drag example" );

        final JLabel label = new JLabel ( "DRAG ME" );
        label.setTransferHandler ( new TextDragHandler ( label, label.getText () ) );
        label.setBorder ( BorderFactory.createEmptyBorder ( 50, 50, 50, 50 ) );
        frame.add ( label );

        frame.setDefaultCloseOperation ( WindowConstants.EXIT_ON_CLOSE );
        frame.pack ();
        frame.setLocationRelativeTo ( null );
        frame.setVisible ( true );
    }
}

这里最重要的是
exportAsDrag(…)
调用,它在系统内启动拖动操作,并传递
Transferable
实例(在本例中为-
StringSelection
实例)以下是一个小示例,说明如何扩展
TransferHandler
,将文本从
JLabel
(或任何其他组件)拖动到其他正在运行的应用程序中:

import javax.swing.*;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

/**
 * @author Mikle Garin
 * @see https://stackoverflow.com/questions/45437809/drag-and-drop-text-from-java-to-web-browser
 */

public class TextDragHandler extends TransferHandler implements MouseListener, MouseMotionListener
{
    /**
     * Drag source component.
     */
    private final JComponent component;

    /**
     * Text to drag.
     */
    private final String text;

    /**
     * Whether or not drag was armed.
     * This flag is used to avoid multiple export operations.
     */
    private boolean armed;

    /**
     * Constructs new {@link TextDragHandler}.
     *
     * @param component drag source component
     * @param text      text to drag
     */
    public TextDragHandler ( final JComponent component, final String text )
    {
        super ();
        this.armed = false;
        this.text = text;
        this.component = component;
        this.component.addMouseListener ( this );
        this.component.addMouseMotionListener ( this );
    }

    @Override
    public void mouseClicked ( final MouseEvent e )
    {
        // Do nothing
    }

    @Override
    public void mousePressed ( final MouseEvent e )
    {
        if ( component.isEnabled () && SwingUtilities.isLeftMouseButton ( e ) )
        {
            armed = true;
        }
    }

    @Override
    public void mouseReleased ( final MouseEvent e )
    {
        if ( SwingUtilities.isLeftMouseButton ( e ) )
        {
            armed = false;
        }
    }

    @Override
    public void mouseEntered ( final MouseEvent e )
    {
        // Do nothing
    }

    @Override
    public void mouseExited ( final MouseEvent e )
    {
        // Do nothing
    }

    @Override
    public void mouseMoved ( final MouseEvent e )
    {
        // Do nothing
    }

    @Override
    public void mouseDragged ( final MouseEvent e )
    {
        if ( armed )
        {
            exportAsDrag ( component, e, getSourceActions ( component ) );
            armed = false;
        }
    }

    @Override
    public int getSourceActions ( final JComponent c )
    {
        return COPY;
    }

    @Override
    protected Transferable createTransferable ( final JComponent c )
    {
        return new StringSelection ( text );
    }

    /**
     * Sample {@link TextDragHandler} usage.
     *
     * @param args run arguments
     */
    public static void main ( final String[] args )
    {
        final JFrame frame = new JFrame ( "Drag example" );

        final JLabel label = new JLabel ( "DRAG ME" );
        label.setTransferHandler ( new TextDragHandler ( label, label.getText () ) );
        label.setBorder ( BorderFactory.createEmptyBorder ( 50, 50, 50, 50 ) );
        frame.add ( label );

        frame.setDefaultCloseOperation ( WindowConstants.EXIT_ON_CLOSE );
        frame.pack ();
        frame.setLocationRelativeTo ( null );
        frame.setVisible ( true );
    }
}

这里最重要的是
exportAsDrag(…)
调用,它在系统内启动拖动操作,并传递
Transferable
实例(在本例中为-
StringSelection
实例)进入该拖动操作。

可能重复的@Garin可能重复的操作您是否注意到在尝试拖放到firefox时出现的延迟?@Karuhanga您是指在拖动上述示例中的文本时?-没有发现任何延迟,只是用最新的FF进行了检查。尽管重要的是要理解,无论何时开始这种拖动操作,都取决于底层操作系统和将数据拖放到其中的应用程序。这意味着不同的操作系统/软件组合可以产生完全不同的结果。作为拖动“导出器”,您只能为其提供各种受支持的数据样式和数据,不能直接影响拖动操作本身。@Karuhanga因此,例如,某些Linux版本存在D&D问题,并且由于某些特定的D&D尝试,system UI manager甚至可能完全冻结。Windows 8在根据系统用户权限删除Java应用程序方面存在问题。MacOSX也有一些问题,这取决于JDK/OS版本。因此,在你的具体情况下,你会遇到一些研发问题,我并不感到惊讶:)我明白了。我在Ubuntu 16.04上遇到了Firefox的问题。我想我会试试窗户,看看是否一样。是的,我试过文本和图像,Firefox对
dragover
事件的反应似乎比chrome慢。谢谢。@Garin您在尝试进入firefox时注意到延迟了吗?@Karuhanga您是说在拖动上面示例中的文本时?-没有发现任何延迟,只是用最新的FF进行了检查。尽管重要的是要理解,无论何时开始这种拖动操作,都取决于底层操作系统和将数据拖放到其中的应用程序。这意味着不同的操作系统/软件组合可以产生完全不同的结果。作为拖动“导出器”,您只能为其提供各种受支持的数据样式和数据,不能直接影响拖动操作本身。@Karuhanga因此,例如,某些Linux版本存在D&D问题,并且由于某些特定的D&D尝试,system UI manager甚至可能完全冻结。Windows 8在根据系统用户权限删除Java应用程序方面存在问题。MacOSX也有一些问题,这取决于JDK/OS版本。因此,在你的具体情况下,你会遇到一些研发问题,我并不感到惊讶:)我明白了。我在Ubuntu 16.04上遇到了Firefox的问题。我想我会试试窗户,看看是否一样。是的,我试过文本和图像,Firefox对
dragover
事件的反应似乎比chrome慢。谢谢你。