最新消息:历时半年,永住昨天下来了

Java的拖动处理

之前在公司里写了一个测试的小工具,里面有一个文件选择的功能,是用JFileChooser来实现的,不过Java的文件选择框真不好用。想想如果能直接把文件拖到文本框里就好了,在网上找了一下,原来可以用DropTarget来实现。DropTarget的构造函数里有三个参数,第一个表示接收拖动动作的控件,第二个是指什么动作(试了一下,好像没用,知道的可以给我留言),第三个实现拖动动作。大体的实现代码如下:

Java
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.io.File;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class TestFrame extends JFrame {
    private static final long serialVersionUID = 4773624068904490097L;

    private JTextArea txaResult;
    private JScrollPane slpResult;

    public TestFrame() {
        // 设置画面显示大小
        setSize(300, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        txaResult = new JTextArea();
        slpResult = new JScrollPane(txaResult);
        getContentPane().add(slpResult);

        new DropTarget(txaResult, DnDConstants.ACTION_COPY,
                new DropTargetAdapter() {
                    @SuppressWarnings("unchecked")
                    @Override
                    public void drop(DropTargetDropEvent event) {
                        event.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
                        Transferable transferable = event.getTransferable();
                        DataFlavor[] flavors = transferable
                                .getTransferDataFlavors();

                        append(flavors.length);
                        for (int i = 0; i < flavors.length; i++) {
                            DataFlavor d = flavors[i];
                            try {
                                if (d.equals(DataFlavor.javaFileListFlavor)) {
                                    // 文件、文件夹拖动结果取得
                                    append("=== javaFileListFlavor ===");
                                    List valueList = (List)transferable.getTransferData(d);
                                    for (File value : valueList) {
                                        append(value);
                                    }
                                } else if (d.equals(DataFlavor.stringFlavor)) {
                                    // 字符串拖动结果取得
                                    append("=== stringFlavor ===");
                                    String value = (String) transferable.getTransferData(d);
                                    append(value);
                                } else {
                                    // 其它拖动
                                    append("=== other:" + d + " ===");
                                    append(transferable.getTransferData(d)
                                            .getClass());
                                    append(transferable.getTransferData(d));
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                });
    }

    public void append(Object value) {
        txaResult.append(value + "rn");
        JScrollBar vbar = slpResult.getVerticalScrollBar();
        vbar.setValue(vbar.getMaximum());
    }

    public static void main(String[] argv) {
        final TestFrame frame = new TestFrame();
        frame.setVisible(true);
    }
}

转载请注明:宇托的狗窝 » Java的拖动处理

发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. 类文件,看着有些晕
    小林2014-01-25 21:52:14回复