Java Swing編程:拖放功能
拖放功能其實(shí)就像我們使用windows 的時(shí)候按住CTRL然后拖動(dòng)某個(gè)圖標(biāo),會(huì)復(fù)制該對(duì)象。這給用戶提供了很棒的用戶體驗(yàn),沒(méi)辦法程序員總是給自己找麻煩,讓用戶覺(jué)得方便,其實(shí)這個(gè)功能AWT也提供了Swing話只是利用了這個(gè),因?yàn)檫@和界面沒(méi)什么關(guān)系。
DropTarget(拖放目的地)eg(將圖片拖入后顯示):
- public class TestDropTarget
- {
- final int DESKTOP_WIDTH = 480;
- final int DESKTOP_HEIGHT = 360;
- final int FRAME_DISTANCE = 30;
- JFrame jf = new JFrame("測(cè)試拖放目標(biāo)——把圖片文件拖入該窗口");
- //定義一個(gè)虛擬桌面
- private JDesktopPane desktop = new JDesktopPane();
- //保存下一個(gè)內(nèi)部窗口的座標(biāo)點(diǎn)
- private int nextFrameX;
- private int nextFrameY;
- //定義內(nèi)部窗口為虛擬桌面的1/2大小
- private int width = DESKTOP_WIDTH / 2;
- private int height = DESKTOP_HEIGHT / 2;
- public void init()
- {
- desktop.setPreferredSize(new Dimension(DESKTOP_WIDTH, DESKTOP_HEIGHT));
- //將當(dāng)前窗口創(chuàng)建成拖放源
- new DropTarget(jf, DnDConstants.ACTION_COPY , new ImageDropTargetListener());
- jf.add(desktop);
- jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- jf.pack();
- jf.setVisible(true);
- }
- class ImageDropTargetListener extends DropTargetAdapter
- {
- public void drop(DropTargetDropEvent event)
- {
- //接受復(fù)制操作
- event.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
- //獲取拖放的內(nèi)容
- Transferable transferable = event.getTransferable();
- DataFlavor[] flavors = transferable.getTransferDataFlavors();
- //遍歷拖放內(nèi)容里的所有數(shù)據(jù)格式
- for (int i = 0; i < flavors.length; i++)
- {
- DataFlavor d = flavors[i];
- try
- {
- //如果拖放內(nèi)容的數(shù)據(jù)格式是文件列表
- if (d.equals(DataFlavor.javaFileListFlavor))
- {
- //取出拖放操作里的文件列表
- java.util.List fileList
- = (java.util.List) transferable.getTransferData(d);
- for (Object f : fileList)
- {
- //顯示每個(gè)文件
- showImage((File)f , event);
- }
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- //強(qiáng)制拖放操作結(jié)束,停止阻塞拖放源
- event.dropComplete(true);
- }
- }
- //顯示每個(gè)文件的工具方法
- private void showImage(File f , DropTargetDropEvent event)throws java.io.IOException
- {
- Image image = ImageIO.read(f);
- if (image == null)
- {
- //強(qiáng)制拖放操作結(jié)束,停止阻塞拖放源
- event.dropComplete(true);
- JOptionPane.showInternalMessageDialog(desktop , "系統(tǒng)不支持這種類型的文件");
- //方法返回,不會(huì)繼續(xù)操作
- return;
- }
- ImageIcon icon = new ImageIcon(image);
- //創(chuàng)建內(nèi)部窗口顯示該圖片
- JInternalFrame iframe = new JInternalFrame(f.getName()
- ,true , true , true , true);
- JLabel imageLabel = new JLabel(icon);
- iframe.add(new JScrollPane(imageLabel));
- desktop.add(iframe);
- //設(shè)置內(nèi)部窗口的原始位置(內(nèi)部窗口默認(rèn)大小是0X0,放在0,0位置)
- iframe.reshape(nextFrameX, nextFrameY, width, height);
- //使該窗口可見(jiàn),并嘗試選中它
- iframe.show();
- //計(jì)算下一個(gè)內(nèi)部窗口的位置
- nextFrameX += FRAME_DISTANCE;
- nextFrameY += FRAME_DISTANCE;
- if (nextFrameX + width > desktop.getWidth()) nextFrameX = 0;
- if (nextFrameY + height > desktop.getHeight()) nextFrameY = 0;
- }
- }
- public static void main(String[] args)
- {
- new TestDropTarget().init();
- }
- }
DropSource(拖放源)eg(將文字拖入支持拖放的文本編輯器Editplus,Eclipse,idea等。。。記事本,UltraEdit竟然不支持)拖放源主要是要將拖放對(duì)象組成Transferable對(duì)象
- public class TestDragSource
- {
- JFrame jf = new JFrame("Swing的拖放支持");
- JLabel srcLabel = new JLabel("AWT的拖放支持./n"
- +"將該文本域的內(nèi)容拖入其他程序./n");
- public void init()
- {
- DragSource dragSource = DragSource.getDefaultDragSource();
- //將srcLabel轉(zhuǎn)換成拖放源,它能接受復(fù)制、移動(dòng)兩種操作
- dragSource.createDefaultDragGestureRecognizer(srcLabel,
- DnDConstants.ACTION_COPY_OR_MOVE, new DragGestureListener()
- {
- public void dragGestureRecognized(DragGestureEvent event)
- {
- //將JLabel里的文本信息包裝成Transferable對(duì)象
- String txt = srcLabel.getText();
- Transferable transferable = new StringSelection(txt);
- //繼續(xù)拖放操作,拖放過(guò)程中使用手狀光標(biāo)
- event.startDrag(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR),
- transferable);
- }
- });
- jf.add(new JScrollPane(srcLabel));
- jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- jf.pack();
- jf.setVisible(true);
- }
- public static void main(String[] args)
- {
- new TestDragSource().init();
- }
- }
JDK1.4開(kāi)始對(duì)Swing的拖放功能做了簡(jiǎn)化,不同組件分別提供了拖放源和拖放目標(biāo),這里就講用的最多的文本域,他既能拖入文本,也能將文本拖出,非常方便。
但默認(rèn)這個(gè)功能沒(méi)有啟用,要手動(dòng)調(diào)用setDragEnabled方法,使其生效。eg
- public class SwingDndSupport
- {
- JFrame jf = new JFrame("Swing的拖放支持");
- JTextArea srcTxt = new JTextArea(8 , 30);
- JTextField jtf = new JTextField(34);
- public void init()
- {
- srcTxt.append("AWT的拖放支持./n");
- srcTxt.append("將該文本域的內(nèi)容拖入其他程序./n");
- //啟動(dòng)文本域和單行文本框的拖放支持
- srcTxt.setDragEnabled(true);
- jtf.setDragEnabled(true);
- jf.add(new JScrollPane(srcTxt));
- jf.add(jtf , BorderLayout.SOUTH);
- jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- jf.pack();
- jf.setVisible(true);
- }
- public static void main(String[] args)
- {
- new SwingDndSupport().init();
- }
- }
方便吧,今天就講到這里了。
原文鏈接:http://blog.csdn.net/terryzero/article/details/3779252
【編輯推薦】