java drag_java Drag and drop

DnD介绍

就是Drag and drop,就是拖放。

JColorChooser、JEditorPane、JFileChooser、JFormattedTextField、JList、JTable、JTextArea、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、JTable、JTree需要提供自定义的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、JFileChooser、JFormattedTextField、JTextArea、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_SELECTION、DropMode.ON、DropMode.INSERT、DropMode.ON_OR_INSERT四种之一。USE_SELECTION表示新拖入的项目被选中;ON表示原来被选中的项目不变(仍然选中);INSERT表示插入;ON_OR_INSERT表示插入并且原来被选中的项目不变(仍然选中)。

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

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

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

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

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

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

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

参数:

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

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

action -已执行的实际操作

一些例子:

int getSourceActions(JComponent c) {

return COPY_OR_MOVE;//可以是COPY、MOVE、COPY_OR_MOVE、LINK中的一种。

}

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表示Image类,DataFlavor.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、publicComponentgetComponent()

返回此传输的目标组件。

2、public int getDropAction()

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

3、public int getUserDropAction()

当此 表示一个放置操作时,返回其用户放置动作。TransferSupport

Ctrl + Shift -> ACTION_LINK拖动时按住Ctrl和Shift表示连接返回ACTION_LINK;

Ctrl-> ACTION_COPY如上不用说了。

Shift-> ACTION_MOVE如上不用说了。

4、public int getSourceDropActions()

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

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

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

5、public DataFlavor[] getDataFlavors()

返回此传输的数据flavor。

6、public boolean isDataFlavorSupported(DataFlavor df)

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

7、public Transferable getTransferable()

返回与此传输关联的Transferable。

8、public TransferHandler.DropLocation getDropLocation()

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

getDropLocation()的详细介绍:

To obtain the location of the drop, the TransferSupport class provides thegetDropLocationmethod 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, calledJList.DropLocation.

This class provides thegetIndexandisInsertmethods, which handle the math for you This class provides thegetIndexandisInsertmethods, which handle the math for youThis class provides thegetIndexandisInsertmethods, which handle the math for you。

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

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

未完

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值