将文本从Java拖放到web浏览器
我想让一个JavaSwing标签(包含文本)可以拖动,这样就可以将它放到浏览器窗口中(js侦听器在其中拾取文本)。使其可拖动很容易,但如何将其转移到浏览器窗口 我一直在搜索关于这方面的文档,但我发现的大部分内容都是很久以前(1999年)的:将文本从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
以下是一个小示例,说明如何扩展
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慢。谢谢你。