package elte.java2_utikalauz5.gui; /** Példaprogram az adatáthúzási (Drag&Drop) művelet szemléltetésére, amely képes áthúzással adatok vételére és átadására. A felület csupán egy többsoros szövegmezőből áll. Adatáthúzási művelet csak a kiválasztott szövegrészről indítható. Az adatátvitel alapértelmezett típusaként a másolást részesítjük előnyben, átmozgatás (és az eredeti tartalom törlése) csak a felhasználó kifejezett kívánsága (a Shift módosító billentyűt lenyomva) esetén történik. Bár a felület képes az adatáthúzás fogadására, ezt mégis letiltjuk, amennyiben maga a komponens indította a műveletet. Ugyanakkor fogadáskor csak az adatmásolást támogatjuk, nehogy átmozgatás esetén az adatok törlődése a forrásoldalon gondot okozzon. @link.forrásfájl {@docRoot}/../data/gui/src DnDTeszt.java @link.letöltés {@docRoot}/../data/gui DnDTeszt.jar @see java.awt.dnd @see java.awt.datatransfer @since Java 2 Útikalauz programozóknak 5.0 */ public class DnDTeszt implements java.awt.dnd.DragGestureListener, java.awt.dnd.DragSourceListener, java.awt.dnd.DropTargetListener { /** A felületet alkotó többsoros szövegmező */ private java.awt.TextArea szöveg = new java.awt.TextArea(); /** GUI-t felépítő és a DnD-t inicializáló konstruktor. @param felület a felhasználói felületet tartalmazó konténer */ public DnDTeszt( java.awt.Container felület ) { if (felület!=null) { felület.setLayout( new java.awt.BorderLayout() ); felület.add( szöveg ); java.awt.dnd.DragSource indító = java.awt.dnd.DragSource. getDefaultDragSource(); //áthúzás indítható a szövegmezőről indító.createDefaultDragGestureRecognizer( szöveg, java.awt.dnd. DnDConstants.ACTION_COPY_OR_MOVE, this); //DnD fogadása java.awt.dnd.DropTarget fogadó=new java.awt.dnd.DropTarget( szöveg, this); } } /** Jelzi, ha a szövegmező DnD áthúzást indított */ private boolean küld = false; /** Áthúzási művelet kezdeményezése. @param kezdemény a felhasználó által megtett kezdeményezési eseményobjektum */ public void dragGestureRecognized(java.awt.dnd.DragGestureEvent kezdemény) { if (szöveg.getSelectionEnd() > szöveg.getSelectionStart()) {//csak kivá- küld = true; //lasztott szöveget lehet áthúzni kezdemény.startDrag(null, new java.awt.datatransfer.StringSelection( szöveg.getSelectedText()), this); //áthúzás megkezdése } } /** Az elindított áthúzási művelet típusát jelzi, igaz ha adatmásolás */ private boolean másol = false; /** Indított áthúzási művelet típusának megjelenítése fogadóhelyre lépéskor. @param indítóesemény a fogadóhelyre lépés eseményobjektuma */ public void dragEnter(java.awt.dnd.DragSourceDragEvent indítóesemény) { másol =(indítóesemény.getGestureModifiersEx()&java.awt.event.InputEvent. SHIFT_DOWN_MASK) == 0; //alapértelmezett esetben másolás dragOver( indítóesemény ); //egérmutató beállítása } /** Indított áthúzási művelet típusának megjelenítése fogadóhely felett. @param indítóesemény a fogadóhely felett mozgás eseményobjektuma */ public void dragOver(java.awt.dnd.DragSourceDragEvent indítóesemény) { indítóesemény.getDragSourceContext().setCursor( másol ? java.awt.dnd. DragSource.DefaultCopyDrop:java.awt.dnd.DragSource.DefaultMoveDrop); } /** Indított áthúzási művelet típusának módosítása. @param indítóeset aa áthúzási művelet típusát módosító esemény */ public void dropActionChanged(java.awt.dnd.DragSourceDragEvent indítóeset) { dragEnter( indítóeset ); //művelet új típusának kiértékelése } /** Indított áthúzási művelet fogadóhelye elhagyásakor egérmutató visszaállítása @param indítóesemény a fogadóhely elhagyásának eseményobjektuma */ public void dragExit(java.awt.dnd.DragSourceEvent indítóesemény) { indítóesemény.getDragSourceContext().setCursor( másol ? java.awt.dnd. DragSource.DefaultCopyNoDrop:java.awt.dnd.DragSource.DefaultMoveNoDrop); } /** Az indított áthúzási művelet befejezése @param indítóesemény a művelet bejefezését jelző eseményobjektum */ public void dragDropEnd(java.awt.dnd.DragSourceDropEvent indítóesemény) { küld = false; //vége az adatküldésnek if (indítóesemény.getDropSuccess()&&!másol) szöveg.replaceRange("", szöveg.getSelectionStart(), szöveg.getSelectionEnd()); //átmozgatás } /** Jelzi, ha a szövegmező DnD áthúzást fogad */ private boolean fogad = false; /** Fogadott áthúzási művelet elfogadása a fogadóhelyre lépéskor. @param fogadóesemény a fogadóhelyre lépés eseményobjektuma */ public void dragEnter(java.awt.dnd.DropTargetDragEvent fogadóesemény) { for (java.awt.datatransfer.DataFlavor típus:fogadóesemény. //csak szöveg getCurrentDataFlavors()) if (fogad = típus.isFlavorTextType() || típus.isFlavorJavaFileListType()) break;//és fájllista elfogadása dragOver(fogadóesemény); //egérmutató beállítása } /** Fogadott áthúzási művelet elfogadásának megjelenítése fogadóhely felett. @param fogadóesemény a fogadóhely felett mozgás eseményobjektuma */ public void dragOver(java.awt.dnd.DropTargetDragEvent fogadóesemény) { if (fogad && !küld) fogadóesemény.acceptDrag(java.awt.dnd.DnDConstants. ACTION_COPY); //csak másolással fogadunk adatokat else fogadóesemény.rejectDrag(); //nem fogadjuk az adatokat } /** Fogadott áthúzási művelet típusának módosítása. @param fogadóeset aa áthúzási művelet típusát módosító esemény */ public void dropActionChanged(java.awt.dnd.DropTargetDragEvent fogadóeset) { dragOver(fogadóeset); //egérkurzor beállítása } /** Fogadott áthúzási művelet fogadóhelyének elhagyása @param fogadóesemény a fogadóhely elhagyásának eseményobjektuma */ public void dragExit(java.awt.dnd.DropTargetEvent fogadóesemény) { fogad = false; //adatfogadás befejezése } /** Fogadott áthúzási művelet adatátvétele @param fogadóesemény a fogadott áthúzási művelet eseményobjektuma */ public void drop(java.awt.dnd.DropTargetDropEvent fogadóesemény) { fogadóesemény.acceptDrop(java.awt.dnd.DnDConstants.ACTION_COPY); //jöhet boolean siker = false; //adatátvétel sikerességét jelzi java.awt.datatransfer.Transferable adat=fogadóesemény.getTransferable(); java.awt.datatransfer.DataFlavor típus =//legjobb adattípus kiválasztása java.awt.datatransfer.DataFlavor.stringFlavor; //Java szöveg if (!adat.isDataFlavorSupported( típus )) //Unicode szöveg típus=java.awt.datatransfer.DataFlavor.getTextPlainUnicodeFlavor(); if (!adat.isDataFlavorSupported(típus)) //a legmegfelelőbb szövegtípus típus = java.awt.datatransfer.DataFlavor.selectBestTextFlavor( fogadóesemény.getCurrentDataFlavors()); //kiválasztása try { //adatok átvétele StringBuilder újszöveg = new StringBuilder(1024); //szövegként if (típus!=null) { char buffer[] = new char[1024]; java.io.Reader tartalom = típus.getReaderForText( adat ); while (true) { //szöveg kiolvasása az adatokból int hossz = tartalom.read(buffer); if (hossz<0) break; újszöveg.append(buffer, 0, hossz); } tartalom.close(); } else {@SuppressWarnings( "unchecked" ) //fájlista esetén a fájlnevek átvétele java.util.List fájlok = (java.util.List)adat. getTransferData(java.awt.datatransfer.DataFlavor. javaFileListFlavor); for (java.io.File fájl : fájlok) { if (újszöveg.length()>0) újszöveg.append(","); újszöveg.append(fájl); } } //átvett szöveg megjelenítése szöveg.insert(újszöveg.toString(), szöveg.getCaretPosition()); siker = true; //adatátvétel sikeres volt } catch (Exception kivétel) { kivétel.printStackTrace(); //kivétel kiírása } fogadóesemény.dropComplete(siker); //adatátvétel sikerének visszajelzése } /** A grafikus felhasználói felület felépítése. @param felület A felhasználói felületet tartalmazó konténer. @param argumentumok Az indításkor megadott paraméterek. */ public static void felépít(java.awt.Container felület, String argumentumok[]) { new DnDTeszt( felület ); //felület felépítése } /** A tesztprogram indítása. @param argumentumok Az indításkor megadott paraméterek. */ public static void main(String argumentumok[]) { java.awt.Frame ablak = new AblakTeszt.Ablak("Adatáthúzási teszt"); felépít( ablak, argumentumok ); //felület felépítése ablak.setVisible(true); //és megjelenítése } }