java Drag and drop

DnD 介绍

就是Drag and drop,就是拖放。

JColorChooser JEditorPane JFileChooserJFormattedTextFieldJList JTableJTextArea JTextField JTextPane JTree

这些组件提供默认的拖放支持。也就是说只要调用这些组件的setDragEnabled(true)方法,他们就可以被拖动了。

The following components support drop out of the box. If you are using one of these components, your work is done.

但是JList JTableJTree需要提供自定义的TransferHandler代码支持来完成你想要的功能。

The framework for drop is in place for the following components, but you need to plug in a small amount of code to customize the support for your needs.

 

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

import javax.swing.event.*;

 

class LabelDnd

{

 JFrame mainFrame;

 JPanel mainPanel;

 JLabel label;

 JLabel mylabel;

 JTextField textField;

 public LabelDnd() {

  mainFrame = new JFrame (  );

  mainPanel = new JPanel ( new BorderLayout() );

  label = new JLabel ("label");

  //这里调用了TransferHandler的第二个构造函数,参数是一个Java Bean 属性

  label.setTransferHandler( new TransferHandler("text") );

  mylabel = new JLabel("myLabel");

  textField = new JTextField(20);

  //打开textField自带的拖放功能

  textField.setDragEnabled( true );

  mainPanel.add(mylabel,BorderLayout.CENTER);

  mainPanel.add( label,BorderLayout.PAGE_START );

  mainPanel.add( textField,BorderLayout.PAGE_END  );

  mainFrame.getContentPane().add( mainPanel );

  mainFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

  mainFrame.pack();

  mainFrame.setLocationRelativeTo(null);

  mainFrame.setVisible( true );

 }

 public static void main(String[] args)

 {

  new LabelDnd();

 }

}

 

调用JColorChooser JEditorPane JFileChooserJFormattedTextFieldJTextArea JTextField JTextPane类中的setTransferHandler( new TransferHandler("text")就可以让以上类作为目标类改变其值了。比如上例中我要将testField中的文字拖放到label中时,label中的 text属性要改变。所以就设置label.setTransferHandler( new TransferHandler("text") );

 

那么啥是transferHandler

此类用于处理往返于 Swing 组件的 Transferable 的传输。该 Transferable 用于表示通过往/返于剪贴板的剪切、复制或粘贴操作进行交换的数据。它还在拖放操作中使用,以表示对组件进行拖动和放置组件。Swing 提供自动支持剪切、复制和粘贴的键盘绑定的功能,该键盘绑定使用由此类的实现提供的功能。Swing 还提供自动支持拖放操作的功能,该拖放操作使用由此类的实现提供的功能。Swing 开发人员可以主要通过在 Swing 组件上设置 transferHandler 属性专门指定传输语义。

只通过指定构造方法中的属性名称即可实现此类,以提供传输某个组件属性的默认行为。例如,要通过剪贴板或拖放操作将前景色从一个组件传输到另一个组件,可以使用字符串 "foreground" 构造一个 TransferHandler。内置支持将把由 getForeground 返回的颜色用作该传输的源,把由 setForeground 返回的颜色用作传输的目标。(这段话和我前面提到的setTransferHandler( new TransferHandler("text")例子是一样的。

组件中为了支持dnd提供的三个重要函数

1、所有组件中的setDragEnabled(Boolean)打开拖放功能。意思是该组件能不能作为源拖放。默认为false

2、JList, JTable, JTree中的setDropMode(DropMode)设置拖放模式。DropMode.USE_SELECTIONDropMode.ONDropMode.INSERTDropMode.ON_OR_INSERT四种之一。USE_SELECTION表示新拖入的项目被选中;ON表示原来被选中的项目不变(仍然选中);INSERT表示插入;ON_OR_INSERT表示插入并且原来被选中的项目不变(仍然选中)。

 

3、所有组件中的setTransferHandler(TransferHandler newHandler)设置 transferHandler 属性;如果该组件不支持数据传输操作,则为 null

transferHandler中为数据完成导出提供的方法:

1getSourceActions(JComponent) 返回源支持的传输动作的类型;COPYMOVE LINK 的任意按位或组合。

有些模型是不可变的,因此 MOVE 的传输动作不应该在这种情况下公开。返回 NONE 禁用该组件的传输。

2createTransferable(JComponent)创建一个要用作数据传输源的 Transferable。返回要传输的数据表示形式Transferable对象,或者返回 null 如果组件的属性为 null

3exportDone(JComponent source,Transferable data,int action) 在导出数据之后调用。如果该操作为 MOVE,则此方法应该移除已传输的数据。

因为 MOVE 不是此实现支持的操作,所以实现此方法不执行任何操作(getSourceActions 不包括 MOVE)。

参数:

source - 以前作为数据源的组件

data - 已传输的数据,如果该操作为 NONE,则可能为 null

action - 已执行的实际操作

 

    一些例子:

int getSourceActions(JComponent c) {

    return COPY_OR_MOVE;//可以是COPYMOVECOPY_OR_MOVELINK中的一种。

}

 

Transferable createTransferable(JComponent c) {

return new StringSelection(c.getSelection());

/*

StringSelection类是实现传输 String 所需能力的 Transferable。此 Transferable 可以正确支持 DataFlavor.stringFlavor 及所有等效 flavor

什么是Transferable

接口 Transferable定义为传输操作提供数据所使用的类的接口。StringSelection实现了Transferable

什么是DataFlavor

DataFlavor 提供有关数据的元信息。DataFlavor 通常用于访问剪切板上的数据,或者在执行拖放操作时使用。

DataFlavor.stringFlavor表示String类,DataFlavor.imageFlavor表示ImageDataFlavor.javaFileListFlavor要将文件列表传入 Java(及底层平台)或从中传出,需要使用此类型/子类型的 DataFlavor java.util.List 的表示形式类。要求/保证列表的每个元素都是 java.io.File 类型。

*/

}

 

void exportDone(JComponent c, Transferable t, int action) {

    if (action == MOVE) {

        c.removeSelection();

    }

}

transferHandler中为数据完成导入提供的方法:

1、canImport(TransferHandler.TransferSupport)指示一个组件在实际尝试导入给定数据 flavor 的集合之前是否接受其导入。

2、importData(TransferHandler.TransferSupport) 导致从剪贴板或拖放操作的传输。要导入的 Transferable 和要传输到的组件包含在 TransferSupport 中。 拖放实现在调用此方法前调用 canImport 确定是否适合传输,但粘贴的实现不会这样做。因此,调用此方法进行粘贴时不能假定传输一定是可接受的。这种情况下,建议显式调用 canImport

什么是TransferHandler.TransferSupport类?

此类封装剪贴板或拖放传输的所有相关详细信息,并且还允许自定义拖放过程的各方面。 此类的主要目的是提供开发人员需要的信息,以便确定传输的适合性或者导入传输中包含的数据。但它同时又是一个控制器,可自定义拖放过程中的属性,比如是否显示放置位置,使用哪种放置动作等。开发人员通常不需要创建此类的实例。它们是 DnD 实现向 TransferHandler 中的某些方法提供的。你不需要创建的!

TransferHandler.TransferSupport重要方法介绍:

 

1、  public Component getComponent()

返回此传输的目标组件。

2、  public int getDropAction()

当此 TransferSupport 表示放置操作时,返回为其选择的动作。

3、public int getUserDropAction()
当此 TransferSupport 表示一个放置操作时,返回其用户放置动作。
   Ctrl + Shift -> ACTION_LINK拖动时按住CtrlShift表示连接返回ACTION_LINK
   Ctrl         -> ACTION_COPY如上不用说了。
   Shift        -> ACTION_MOVE如上不用说了。
4public int getSourceDropActions()

当此 TransferSupport 表示放置操作时,返回拖动源受支持的放置动作。

源动作表示此传输的源所支持的动作集合,并表示为 COPYMOVE LINK 的某个按位或组合。当要确定放置操作的适合性或者对显式地选择放置动作作决定的时候,可以使用 TransferHandler canImport 方法查询此动作。要确定源是否支持指定动作,可以将该动作与源放置动作进行按位加,然后将结果与初始动作进行比较。例如:

boolean copySupported = (COPY & getSourceDropActions()) == COPY;

5public DataFlavor[] getDataFlavors()

返回此传输的数据 flavor

6public boolean isDataFlavorSupported(DataFlavor df)

返回是否支持给定的数据 flavor。如果支持df返回true否则返回false.

7public Transferable getTransferable()

返回与此传输关联的 Transferable

8public TransferHandler.DropLocation getDropLocation()

TransferSupport 表示一个放置操作时,返回组件的当前放置位置(非 null)。 注:对于带内置放置操作支持的组件,此位置将是一个 DropLocation 的子类,该 DropLocation 的类型与该组件的 getDropLocation 方法返回的相同。

 

getDropLocation()的详细介绍:

To obtain the location of the drop, the TransferSupport class provides the getDropLocation method that returns the precise point where the drop has occurred.

But for a list component, the index of the drop is more useful than a pixel location, so JList provides a special subclass, called JList.DropLocation .

This class provides the getIndex and isInsert methods, which handle the math for you This class provides the getIndex and isInsert methods, which handle the math for youThis class provides the getIndex and isInsert methods, which handle the math for you

为了得到组件的放置位置,TransferSupport提供了getDropLocation方法。但是对于list组件index将比返回实际像素更有用。所以JList提供了一个特殊的子类JList.DropLocation来处理这个类提供了 getindex isinsert方法。

Jlist,JTree,JTable中都提供了getDropLocation内部类,但是含义不同,所具有的方法也不同。如表。

 

 未完

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值