您好,登錄后才能下訂單哦!
這篇文章給大家介紹Java Swing編程中的拖放功能怎么用,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
拖放功能其實(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); //使該窗口可見,并嘗試選中它 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開始對(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(); } }
方便吧,今天就講到這里了。
關(guān)于Java Swing編程中的拖放功能怎么用就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。