- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java实现鼠标拖放功能的方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例讲述了Java利用鼠标的拖放来实现交换程序数据的方法,即所谓的鼠标拖放功能。鼠标的拖放功能在图形化系统中非常常用,Java 提供了java.awt.dnd 和java.awt.datatransfer 包来支持该功能。本例演示如何在程序中实现拖放的实现方法,当在窗口上部的“Hello World!”标签点下鼠标,并拖至窗口下部的文本框放开,则在文本框中将添加“Hello World !”文本;继续上述过程,将继续添加该文本.
该程序功能具体的实现思路和方法为:在鼠标拖放的实现中,两个最重要的概念是拖拽源和放置目标,即drag source 和drop target。拖拽源和放置目标都是与可视化的组件相关联的(如果不可视,还怎么拖呢?!)。拖放技术的实质就是将拖拽源组件上的数据传递到放置目标组件上,因此从底层看,拖放和上例中的剪贴板技术很接近.
拖拽源的实现:拖拽源类必须先创建一个DragGestureRecognizer 实例,表明该类是拖拽源组件类或包含拖拽源组件。可以通过调用DataSource 对象的createDefaultDragGestureRecognizer()方法实现。具体的实现如下:
1
2
|
int
action = DnDConstants.ACTION_COPY_OR_MOVE;
//拖放的类型
ds.createDefaultDragGestureRecognizer(
this
,action,
this
);
|
上面的语句表明, 拖拽源组件是本类自身的实例对象, 要完成的拖放的种类是DnDConstants.ACTION_COPY_OR_MOVE 型的,实现DragGestureListener 接口的类是本类。拖拽源一般实现DragGestureListener 接口,该接口中定义了一个dragGestureRecognized()方法,当开始拖拽是,DragGestureListener 监听到事件,随即转入dragGestureRecognized()方法处理事件,如将拖拽源的数据发送出去。具体代码:
1
2
3
4
5
6
7
8
9
10
|
public
void
dragGestureRecognized(DragGestureEvent dge) {
//throw new java.lang.UnsupportedOperationException("Method dragGestureRecognized() not yet implemented.");
try
{
Transferable tr =
new
StringSelection(
this
.getText());
//将标签的文本作为数据,由Transferable 对象包装
//开始拖拽,设置光标为DragSource.DefaultCopyNoDrop 形,拖放的数据是tr 对象,DragSourceListener 是本类
dge.startDrag(DragSource.DefaultCopyNoDrop,tr,
this
);
}
catch
(Exception err){
err.printStackTrace();
}
}
|
拖拽源还得实现DragSourceListener 接口,该接口定义了拖拽相关的各状态的事件处理方法。如dragEnter、dragOver、dropActionChanged、dragExit等方法。本例中,将实现dragEnter()方法来设置拖拽时的光标形状,其他的方法为空方法。具体实现代码如下:
1
2
3
4
5
6
7
8
9
10
|
public
void
dragEnter(DragSourceDragEvent dsde) {
//throw new java.lang.UnsupportedOperationException("Method dragEnter() not yet implemented.");
DragSourceContext dsc = dsde.getDragSourceContext();
//得到拖拽源的上下文引用
//设置拖拽时的光标形状
int
action = dsde.getDropAction();
if
((action&DnDConstants.ACTION_COPY)!=
0
)
dsc.setCursor(DragSource.DefaultCopyDrop);
else
dsc.setCursor(DragSource.DefaultCopyNoDrop);
}
|
放置目标的实现:放置目标的类中必须先创建一个DragTarget 实例,来表明本类是放置目标组件类或包含放置目标组件,实现如下:
1
|
new
DropTarget(
this
.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,
this
);
|
上面的语句表明, 放置目标是this.jTextField1 对象, 拖放操作是DnDConstants.ACTION_COPY_OR_MOVE 型的,而实现DropTargetListener 接口的类是本类。与DrafSourceListener 相对应,放置目标或其所在类一般实现DropTargetListener 接口。该接口也定义了很多的方法,如dragEnter、dragOver 等,用于处理当拖放过程进入不同阶段时的事件。本例只关心drop()方法,即当在放置目标组件上放开鼠标时的事件处理,一般用来处理传递到的数据,如本例中将在JTextField 组件上显示传递来的文本数据,其他方法为空方法,具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public
void
drop(DropTargetDropEvent dtde) {
//throw new java.lang.UnsupportedOperationException("Method drop() not yet implemented.");
try
{
Transferable tr = dtde.getTransferable();
//得到传递来的数据对象
//处理数据对象,得到其中的文本信息
if
(dtde.isDataFlavorSupported(DataFlavor.stringFlavor)){
dtde.acceptDrop(dtde.getDropAction());
String s = (String) tr.getTransferData(DataFlavor.stringFlavor);
this
.jTextField1.setText(
this
.jTextField1.getText()+s);
//在放置目标上显示从拖拽源传递来的文本信息
dtde.dropComplete(
true
);
}
else
{
dtde.rejectDrop();
}
}
catch
(Exception err){
err.printStackTrace();
}
}
|
程序代码:
1.新建一个Project,取名为JDragAndDropDemo。 2.新建一个Application,取名为JDragAndDropDemo;主窗口取名为MainFrame,标题为JDragAndDropDemo。 3.新建一个Class,取名为DragJLabel,继承JLabel 类。 4.利用wizards|implements interface 使DragJLabel 类实现DragGestureListener 、DragSourceListener 接口。 5.在类DragJLabel 中添加新的属性 DragSource ds,代码如下:
1
2
3
4
|
class
DragJLabel
extends
JLabel
implements
DragGestureListener, DragSourceListener {
DragSource ds = DragSource.getDefaultDragSource();
//创建DragSource 实例
……
}
|
6.编写DragJLabel 类的构造方法.
1
2
3
4
5
|
public
DragJLabel(String title,
int
alignment){
super
(title,alignment);
//使用父类的方法
int
action = DnDConstants.ACTION_COPY_OR_MOVE;
ds.createDefaultDragGestureRecognizer(
this
,action,
this
);
//创建
}
|
7.实现DragJLabel 类中的dragGestureRecognized()方法,包装并发送数据.
1
2
3
4
5
6
7
8
9
|
public
void
dragGestureRecognized(DragGestureEvent dge) {
//throw new java.lang.UnsupportedOperationException("Method dragGestureRecognized() not yet implemented.");
try
{
Transferable tr =
new
StringSelection(
this
.getText());
dge.startDrag(DragSource.DefaultCopyNoDrop,tr,
this
);
}
catch
(Exception err){
err.printStackTrace();
}
}
|
8.实现DragJLabel 类中的dragEnter()方法,设置光标的形状.
1
2
3
4
5
6
7
8
9
|
public
void
dragEnter(DragSourceDragEvent dsde) {
//throw new java.lang.UnsupportedOperationException("Method dragEnter() not yet implemented.");
DragSourceContext dsc = dsde.getDragSourceContext();
int
action = dsde.getDropAction();
if
((action&DnDConstants.ACTION_COPY)!=
0
)
dsc.setCursor(DragSource.DefaultCopyDrop);
else
dsc.setCursor(DragSource.DefaultCopyNoDrop);
}
|
9.在MainFrame 类的设计窗口中下部添加一个JTextField 组件,并在类中创建一个DragJLabel实例,具体代码如下:
1
2
3
4
5
6
7
|
public
class
MainFrame
extends
JFrame
implements
DropTargetListener {
private
JPanel contentPane;
private
BorderLayout borderLayout1 =
new
BorderLayout();
private
JTextField jTextField1 =
new
JTextField();
DragJLabel label =
new
DragJLabel(
"Hello World !"
,SwingConstants.CENTER);
……
}
|
10.编写MainFrame 类的初始化方法jbInit(),设置组件的初始属性,并创建一个新的DropTarget实例,代码如下:
1
2
3
4
5
6
7
8
9
10
11
|
private
void
jbInit()
throws
Exception {
//setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[Your Icon]")));
contentPane = (JPanel)
this
.getContentPane();
contentPane.setLayout(borderLayout1);
this
.setSize(
new
Dimension(
410
,
114
));
this
.setTitle(
"JDragAndDropDemo"
);
jTextField1.setFont(
new
java.awt.Font(
"Dialog"
,
0
,
14
));
contentPane.add(jTextField1, BorderLayout.SOUTH);
contentPane.add(
this
.label,BorderLayout.NORTH);
new
DropTarget(
this
.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,
this
);
}
|
11.利用wizards|implements interface 使MainFrame 类实现DropTargetListener 接口.
12.实现继承自DropTargetListener 接口的方法drop(),处理传递来的数据,具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public
void
drop(DropTargetDropEvent dtde) {
//throw new java.lang.UnsupportedOperationException("Method drop() not yet implemented.");
try
{
Transferable tr = dtde.getTransferable();
if
(dtde.isDataFlavorSupported(DataFlavor.stringFlavor)){
dtde.acceptDrop(dtde.getDropAction());
String s = (String) tr.getTransferData(DataFlavor.stringFlavor);
this
.jTextField1.setText(
this
.jTextField1.getText()+s);
dtde.dropComplete(
true
);
}
else
{
dtde.rejectDrop();
}
}
catch
(Exception err){
err.printStackTrace();
}
}
|
最后此篇关于Java实现鼠标拖放功能的方法的文章就讲到这里了,如果你想了解更多关于Java实现鼠标拖放功能的方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在这里有一个我想要做的事情的例子:http://jsbin.com/OwoYAlEQ/1/edit 这是我的 HTML: person one person two person three per
我想知道是否有人知道是否有一个预先制定的解决方案:我在 ASP.net 网站上有一个列表,我希望用户能够通过拖放对列表进行重新排序。此外,我希望有第二个列表,用户可以将第一个列表中的项目拖到其中。 到
我想知道是否有人知道是否有一个预先制定的解决方案:我在 ASP.net 网站上有一个列表,我希望用户能够通过拖放对列表进行重新排序。此外,我希望有第二个列表,用户可以将第一个列表中的项目拖到其中。 到
我在我的 Web 应用程序中使用 Ajax ControlToolkit 中的 ModalPopupExtender。我将其 Drag 属性设置为 true,但是当我拖动弹出面板并将其放到新位置时,它
所以,基于this answer ,我有一组可以拖放并卡入到位的 div。唯一的问题是,可拖动的 div 具有不同的高度,我需要它们始终捕捉到目标的底部,而不是顶部。 您可以在this JsFiddl
我一直在使用 Bea 的解决方案 here一段时间后发现它非常有帮助。现在我遇到的问题是,当我将项目拖放到另一个 ListView 控件中或拖放到另一个 ListView 控件中,并且我想在拖动“期间
我试图在使用 QTreeWidget.setItemWidget() 重新父级(拖放)后将小部件放入 QTreeWidgetItem 但是,如果编译以下代码,结果是 QTreeWidgetItem 内
这是场景,我使用的是prototype和scriptaculous,但我相信jquery也会有同样的问题。我在相对定位的 div 中有一个可拖动图像的列表。问题是我无法将图像拖出父 div...好吧.
我正在使用一个普通(Bootstrap)表,我想在其中包含可排序的行。我正在使用 Angular CDK (DragDropModule) 来实现排序/排序。但是,当拖动行时,它会扭曲宽度,因为 cd
我正在尝试在我的 UICollectionView 中实现拖放机制,这与在快捷方式应用程序中重新排序快捷方式的组件非常相似。 截至目前,行为是当您开始拖动时,会留下一个透明的单元格 View ,而另一
我有以下 Jquery UI 拖放 jsfiddle https://jsfiddle.net/zoojsfiddle/ud96jdcp/ 具有
我希望创建一个基于网络的“公告板”,可以这么说,用户可以在其中创建/删除/拖放“图钉”,而不允许重叠“图钉”。 这是一个图表,应该有助于说明我正在尝试创建的内容: 'pins' 可能已创建双击;他们会
我是一名优秀的程序员,十分优秀!