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
}
}