我最近对对Java中的Drag and Drop做了一个总结, 觉得大致可以通过两种方法实现Drag and Drop:
1.比较初级的D&D:只利用java.awt.datatransfer.*中的类实现.
2.高级D&D: 利用javax.awt.dnd.*中的类实现.
比较初级D&D:只利用java.awt.datatransfer.*中的类实现.
这种方法只支持对JComponent的拖拽.
Drag and Drop的问题简单的说要涉及到两个部分: Drag Source, Drop target和Transferable 即从哪里drag来的, 以及drop到哪里去, 以及传输的数据.
Drag Source可以分为两种:
1.第一种是这样的JComponent, 他们有dragEnabled属性.这些JComponent包括:
javax.swing.JColorChooser
javax.swing.JFileChooser
javax.swing.JList
javax.swing.JTable
javax.swing.JTree
javax.swing.text.JTextComponent
这些JComponent要想作为一个Drag Source只要调用setDragEnabled( true)即可, 不用多余的操作.
2. 另一种Drag Source没有dragEnabled属性, 也就没有setDragEnabled方法, 要想作为Drag Source, 那就要给Component添加MouseMotionListener, 并实现mouseDragged方法, 后面会举例介绍.
Drop Target, 任何JComponent都可以作为Drop Target, 但是也只有JComponent以及它的子类可以作为Drop Target, 其它的不行.
Transferable
所有的Transferable都是javax.swing.Transferable的子类, 但是细分还是可以分为两种情况:
第一种是利用javax.swing.Transferable, 因为javax.swing.Transferable 是一个具体类我们可以直接调用new TransferHandler( String property )生成的transfer handler 作为Component的Transfer Handler, 这样的transfer handler可以将 Java Bean 属性从一个组件传输到另一个组件的传输处理程序。
第二种则是自定义一个TransferHandler的子类, 你可以在这个类中实现复杂的拖拽操作.
下面有两个例子.
第一个例子用简单的javax.swing.Transferable, 第二个例子定义一个javax.swing.Transferable的子类.
例一
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class LabelDnd ...{
private JFrame mainFrame;
private JPanel mainPanel;
private JLabel label;
private JTextField textField;
private JColorChooser colorChooser;
private JMenuBar menuBar = new JMenuBar();
private JMenu menu = new JMenu( "Menu" );
private JMenuItem menuItem = new JMenuItem( "Handle Foregound" );
private TransferHandler t1 = new TransferHandler( "text" ) ;
private TransferHandler t2 = new TransferHandler( "foreground" );
public LabelDnd() ...{
mainFrame = new JFrame();
mainPanel = new JPanel( new BorderLayout() );
label = new JLabel( "label" );
label.setTransferHandler( t1 );
menuItem.addActionListener( new ActionListener() ...{
public void actionPerformed( ActionEvent e ) ...{
if( label.getTransferHandler().equals( t1 ) ) ...{
LabelDnd.this.menuItem.setText( "Handle Text" );
label.setTransferHandler( t2 );
} else ...{
LabelDnd.this.menuItem.setText( "Handle Foreground" );
label.setTransferHandler( t1 );
}
}
});
menu.add( menuItem );
menu.setTransferHandler( t1 );
menuBar.add( menu );
mainFrame.setJMenuBar( menuBar );
label.addMouseListener( new MouseAdapter() ...{
public void mousePressed( MouseEvent e ) ...{
JComponent c = (JComponent)e.getSource();
TransferHandler handler = c.getTransferHandler();
handler.exportAsDrag( c, e, TransferHandler.COPY );
}
});
textField = new JTextField( 20 );
textField.setDragEnabled( true );
colorChooser = new JColorChooser();
colorChooser.setDragEnabled( true );
mainPanel.add( label, BorderLayout.PAGE_START );
mainPanel.add( textField, BorderLayout.PAGE_END );
mainPanel.add( colorChooser, BorderLayout.WEST );
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();
}
}
效果如下:
你可以试着拖拽下。
例二
PictureDnd.java
package dt;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
import demo.gui.PictureComponent;
import java.awt.datatransfer.*;
import java.io.*;
public class PictureDnd ...{
JFrame mainFrame;
JPanel mainPanel;
PictureComponent[] pictures;
public static void main( String[] args ) ...{
new PictureDnd();
}
public PictureDnd() ...{
mainFrame = new JFrame();
mainPanel = new JPanel( new GridLayout( 2, 2 ) );
pictures = new PictureComponent[ 4 ];
pictures[ 0 ] = new PictureComponent( new ImageIcon( "Sunset.jpg" ).getImage() );
pictures[ 1 ] = new PictureComponent( new ImageIcon( "Winter.jpg" ).getImage() );
pictures[ 2 ] = new PictureComponent( null );
pictures[ 3 ] = new PictureComponent( null );
mainPanel.add( pictures[ 0 ] );
mainPanel.add( pictures[ 1 ] );
mainPanel.add( pictures[ 2 ] );
mainPanel.add( pictures[ 3 ] );
mainPanel.setBorder( BorderFactory.createEmptyBorder( 20, 20, 20, 20 ) );
mainFrame.getContentPane().add( mainPanel );
mainFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
mainFrame.setSize( 350, 400 );
mainFrame.setLocationRelativeTo( null );
mainFrame.setVisible( true );
}
} PicrureComponent.java
package demo.gui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.HashSet;
import javax.swing.JComponent;
public class PictureComponent extends JComponent
implements FocusListener, MouseListener ...{
Image image;
HashSet< PictureComponent > pcs = new HashSet< PictureComponent >();
public PictureComponent( Image image ) ...{
this.image = image;
setPreferredSize( new Dimension(125, 125 ) );
setFocusable( true );
setTransferHandler( new PictureTransferHandler() );
addFocusListener( this );
addMouseListener( this );
}
public HashSet< PictureComponent > getPcs() ...{
return this.pcs;
}
public void setPcs( HashSet< PictureComponent > pcs ) ...{
this.pcs = pcs;
}
public Image getImage() ...{
return this.image;
}
public void setImage( Image image )...{
this.image = image;
repaint();
}
public void paintComponent( Graphics graphics )...{
Graphics g = graphics.create();
g.setColor( Color.white );
g.fillRect( 0, 0
分享到:
相关推荐
本文将深入探讨《Java开发者手册2000》中提到的一些经典代码示例,旨在帮助读者理解如何运用特定的类及其成员来完成具体的任务,并展示这些类之间是如何相互作用的。 #### 二、经典代码示例(Examplets) **定义:...
7. **Drag and Drop**:这部分内容介绍了如何在Java程序中实现拖拽功能,使得用户能够方便地进行文件或数据的移动。 8. **Events**:事件处理是Java图形用户界面开发中的重要组成部分。这部分内容将探讨如何处理...
其中,拖放(Drag and Drop)功能是 Java Swing 中的一种重要功能,允许用户在应用程序中实现拖放操作。在本文中,我们将详细介绍 Java Swing 中的拖放功能,包括其实现原理、常用组件支持、事件处理机制等方面的...
Java SwingSet 示例开发源码详解 Java Swing 是Java标准库中的一个组件,用于构建桌面应用程序的用户界面。SwingSet 是一套用Java Swing编写的示例程序,它展示了Swing的各种组件、布局管理器以及事件处理机制。这...
- Swing 不依赖于本地代码,因此与 Java2D、Accessibility 和 Drag & Drop 等组件在实现上有本质的区别。 #### 八、学习资源 - **《Java Tutorial》:** - Sun Microsystems 提供的在线教程,详细介绍了 Java 编程...
在用户交互设计中,拖放(Drag and Drop)功能是一个常用且实用的设计,它使得用户可以通过直观的手势来移动、排列或交换屏幕上的元素。本篇文章将围绕一个名为"DragAndDropDemo"的小型示例项目,深入探讨如何在...
7. **拖放支持(Drag and Drop)**:SWT 支持控件间的拖放操作,开发者可以注册拖放监听器来处理这一过程。 8. **打印支持(Printing)**:SWT 提供了打印API,使得开发者能够将内容打印到物理打印机。 9. **可...
4. **学习示例**:API文档通常包含代码示例,这有助于理解如何在实际项目中应用API。 总之,SWT API CHM文件是Eclipse开发者不可或缺的参考资料,它提供了详细的API描述和实例,能够帮助开发者更好地理解和使用SWT...
7. **高级特性**:除了基本的GUI构建功能外,Swing还支持许多高级特性,比如拖放操作(Drag and Drop)、剪贴板操作(Clipboard)、打印支持等。 #### 五、参考资源 - **官方文档**:[Swing官方文档]...
通常,这样的源码示例包含完整的代码结构,包括布局文件、Java类、可能的XML配置等,有助于初学者或者有经验的开发者学习和实践。 【知识点详解】 1. **ListView基础**:首先,我们需要了解ListView的基本用法,它...
- **拖拉**:使用 `Actions` 类的 `dragAndDrop` 方法实现拖拽功能。 - **导航**:使用 `navigate()` 方法实现前进、后退等操作。 ##### 3.3 高级使用 - **特性**: - **改变 User Agent**:通过设置浏览器配置...
在这个示例中,Haxe编写的JavaScript代码会监听拖放事件,如`dragstart`、`dragover`、`drop`等,这些事件在用户与网页元素交互时触发,从而实现图像的拖放操作。 7. **跨平台能力**: Haxe的一个关键特性是跨...