`
xumingming64398966@yahoo.com.cn
  • 浏览: 41085 次
文章分类
社区版块
存档分类

Java中的Drag and Drop详解与代码示例

阅读更多

 我最近对对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( 22 ) );
        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( 
20202020 ) );
        mainFrame.getContentPane().add( mainPanel );
        mainFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        mainFrame.setSize( 
350400 );
        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(125125 ) );
        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( 
00
分享到:
评论
1 楼 niceo 2008-07-30  

相关推荐

    Java 程序设计之经典代码

    本文将深入探讨《Java开发者手册2000》中提到的一些经典代码示例,旨在帮助读者理解如何运用特定的类及其成员来完成具体的任务,并展示这些类之间是如何相互作用的。 #### 二、经典代码示例(Examplets) **定义:...

    Java经典代码

    7. **Drag and Drop**:这部分内容介绍了如何在Java程序中实现拖拽功能,使得用户能够方便地进行文件或数据的移动。 8. **Events**:事件处理是Java图形用户界面开发中的重要组成部分。这部分内容将探讨如何处理...

    java swing拖放功能

    其中,拖放(Drag and Drop)功能是 Java Swing 中的一种重要功能,允许用户在应用程序中实现拖放操作。在本文中,我们将详细介绍 Java Swing 中的拖放功能,包括其实现原理、常用组件支持、事件处理机制等方面的...

    基于Java的实例开发源码-SwingSet.zip

    Java SwingSet 示例开发源码详解 Java Swing 是Java标准库中的一个组件,用于构建桌面应用程序的用户界面。SwingSet 是一套用Java Swing编写的示例程序,它展示了Swing的各种组件、布局管理器以及事件处理机制。这...

    javaSwing编程

    - Swing 不依赖于本地代码,因此与 Java2D、Accessibility 和 Drag & Drop 等组件在实现上有本质的区别。 #### 八、学习资源 - **《Java Tutorial》:** - Sun Microsystems 提供的在线教程,详细介绍了 Java 编程...

    DragAndDropDemo

    在用户交互设计中,拖放(Drag and Drop)功能是一个常用且实用的设计,它使得用户可以通过直观的手势来移动、排列或交换屏幕上的元素。本篇文章将围绕一个名为"DragAndDropDemo"的小型示例项目,深入探讨如何在...

    SWT API 帮助文档 及源码

    7. **拖放支持(Drag and Drop)**:SWT 支持控件间的拖放操作,开发者可以注册拖放监听器来处理这一过程。 8. **打印支持(Printing)**:SWT 提供了打印API,使得开发者能够将内容打印到物理打印机。 9. **可...

    swt api chm格式

    4. **学习示例**:API文档通常包含代码示例,这有助于理解如何在实际项目中应用API。 总之,SWT API CHM文件是Eclipse开发者不可或缺的参考资料,它提供了详细的API描述和实例,能够帮助开发者更好地理解和使用SWT...

    SwingUI-JFC好书.pdf

    7. **高级特性**:除了基本的GUI构建功能外,Swing还支持许多高级特性,比如拖放操作(Drag and Drop)、剪贴板操作(Clipboard)、打印支持等。 #### 五、参考资源 - **官方文档**:[Swing官方文档]...

    Android应用源码之DragList(可拖拽移动的ListView).rar

    通常,这样的源码示例包含完整的代码结构,包括布局文件、Java类、可能的XML配置等,有助于初学者或者有经验的开发者学习和实践。 【知识点详解】 1. **ListView基础**:首先,我们需要了解ListView的基本用法,它...

    selenium2.0

    - **拖拉**:使用 `Actions` 类的 `dragAndDrop` 方法实现拖拽功能。 - **导航**:使用 `navigate()` 方法实现前进、后退等操作。 ##### 3.3 高级使用 - **特性**: - **改变 User Agent**:通过设置浏览器配置...

    DragAndDropImageSample:用于使用 Haxe 的 html

    在这个示例中,Haxe编写的JavaScript代码会监听拖放事件,如`dragstart`、`dragover`、`drop`等,这些事件在用户与网页元素交互时触发,从而实现图像的拖放操作。 7. **跨平台能力**: Haxe的一个关键特性是跨...

Global site tag (gtag.js) - Google Analytics