Java by API/java.awt.datatransfer/Transferable
Содержание
implements Transferable
<source lang="java">
import java.awt.BorderLayout; import java.awt.Image; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.IOException; import javax.swing.AbstractButton; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.TransferHandler; public class MainClass {
public static void main(String args[]) { JFrame frame = new JFrame("Drag Image"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Icon icon = new ImageIcon("image.jpg"); JLabel label = new JLabel(icon); label.setTransferHandler(new ImageSelection()); MouseListener listener = new MouseAdapter() { public void mousePressed(MouseEvent me) { JComponent comp = (JComponent) me.getSource(); TransferHandler handler = comp.getTransferHandler(); handler.exportAsDrag(comp, me, TransferHandler.COPY); } }; label.addMouseListener(listener); frame.add(new JScrollPane(label), BorderLayout.CENTER); frame.setSize(300, 150); frame.setVisible(true); }
} class ImageSelection extends TransferHandler implements Transferable {
private static final DataFlavor flavors[] = { DataFlavor.imageFlavor }; private Image image; public int getSourceActions(JComponent c) { return TransferHandler.COPY; } public boolean canImport(JComponent comp, DataFlavor flavor[]) { if (!(comp instanceof JLabel) && !(comp instanceof AbstractButton)) { return false; } for (int i = 0, n = flavor.length; i < n; i++) { for (int j = 0, m = flavors.length; j < m; j++) { if (flavor[i].equals(flavors[j])) { return true; } } } return false; } public Transferable createTransferable(JComponent comp) { image = null; if (comp instanceof JLabel) { JLabel label = (JLabel) comp; Icon icon = label.getIcon(); if (icon instanceof ImageIcon) { image = ((ImageIcon) icon).getImage(); return this; } } else if (comp instanceof AbstractButton) { AbstractButton button = (AbstractButton) comp; Icon icon = button.getIcon(); if (icon instanceof ImageIcon) { image = ((ImageIcon) icon).getImage(); return this; } } return null; } public boolean importData(JComponent comp, Transferable t) { if (comp instanceof JLabel) { JLabel label = (JLabel) comp; if (t.isDataFlavorSupported(flavors[0])) { try { image = (Image) t.getTransferData(flavors[0]); ImageIcon icon = new ImageIcon(image); label.setIcon(icon); return true; } catch (UnsupportedFlavorException ignored) { } catch (IOException ignored) { } } } else if (comp instanceof AbstractButton) { AbstractButton button = (AbstractButton) comp; if (t.isDataFlavorSupported(flavors[0])) { try { image = (Image) t.getTransferData(flavors[0]); ImageIcon icon = new ImageIcon(image); button.setIcon(icon); return true; } catch (UnsupportedFlavorException ignored) { } catch (IOException ignored) { } } } return false; } public Object getTransferData(DataFlavor flavor) { if (isDataFlavorSupported(flavor)) { return image; } return null; } public DataFlavor[] getTransferDataFlavors() { return flavors; } public boolean isDataFlavorSupported(DataFlavor flavor) { return flavors[0].equals(flavor); }
}
</source>
Transferable: getTransferData(DataFlavor flavor)
<source lang="java">
import java.awt.BorderLayout; import java.awt.Color; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DnDConstants; import java.awt.dnd.DragGestureEvent; import java.awt.dnd.DragGestureListener; import java.awt.dnd.DragSource; import java.awt.dnd.DragSourceContext; import java.awt.dnd.DragSourceDragEvent; import java.awt.dnd.DragSourceDropEvent; import java.awt.dnd.DragSourceEvent; import java.awt.dnd.DragSourceListener; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.awt.dnd.InvalidDnDOperationException; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; public class MainClass extends JFrame implements ActionListener, DropTargetListener {
DragLabel source = new DragLabel("Drag and drop me to the following JButton", JLabel.CENTER); JButton target = new JButton(); MainClass(String title) { super(title); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); source.setForeground(Color.red); getContentPane().add(source, BorderLayout.NORTH); target.addActionListener(this); getContentPane().add(target, BorderLayout.SOUTH); new DropTarget(target, DnDConstants.ACTION_COPY_OR_MOVE, this); setSize(205, 100); setVisible(true); } public void actionPerformed(ActionEvent e) { JButton b = (JButton) e.getSource(); b.setText(""); source.setText("Drag and drop me to the following JButton"); } public void dragEnter(DropTargetDragEvent e) { System.out.println("Entering drop target #1"); } public void dragExit(DropTargetEvent e) { System.out.println("Exiting drop target #1"); } public void dragOver(DropTargetDragEvent e) { System.out.println("Dragging over drop target #1"); } public void drop(DropTargetDropEvent e) { System.out.println("Dropping"); try { Transferable t = e.getTransferable(); if (e.isDataFlavorSupported(DataFlavor.stringFlavor)) { e.acceptDrop(e.getDropAction()); String s; s = (String) t.getTransferData(DataFlavor.stringFlavor); target.setText(s); e.dropComplete(true); } else e.rejectDrop(); } catch (java.io.IOException e2) { } catch (UnsupportedFlavorException e2) { } } public void dropActionChanged(DropTargetDragEvent e) { System.out.println("Drop action changed #1"); } public static void main(String[] args) { new MainClass("Drag and Drop Demo"); }
} class DragLabel extends JLabel implements DragGestureListener, DragSourceListener {
private DragSource ds = DragSource.getDefaultDragSource(); public DragLabel(String s, int alignment) { super(s, alignment); int action = DnDConstants.ACTION_COPY_OR_MOVE; ds.createDefaultDragGestureRecognizer(this, action, this); } public void dragGestureRecognized(DragGestureEvent e) { try { Transferable t = new StringSelection(getText()); e.startDrag(DragSource.DefaultCopyNoDrop, t, this); } catch (InvalidDnDOperationException e2) { System.out.println(e2); } } public void dragDropEnd(DragSourceDropEvent e) { System.out.println("Drag and drop end"); if (e.getDropSuccess() == false) { System.out.println("unsuccessful"); return; } int action = e.getDropAction(); if ((action & DnDConstants.ACTION_MOVE) != 0) setText(""); } public void dragEnter(DragSourceDragEvent e) { System.out.println("Entering drop target #2"); DragSourceContext ctx = e.getDragSourceContext(); int action = e.getDropAction(); if ((action & DnDConstants.ACTION_COPY) != 0) ctx.setCursor(DragSource.DefaultCopyDrop); else ctx.setCursor(DragSource.DefaultCopyNoDrop); } public void dragExit(DragSourceEvent e) { System.out.println("Exiting drop target #2"); } public void dragOver(DragSourceDragEvent e) { System.out.println("Dragging over drop target #2"); } public void dropActionChanged(DragSourceDragEvent e) { System.out.println("Drop action changed #2"); }
}
</source>
Transferable: getTransferDataFlavors()
<source lang="java">
import java.awt.Toolkit; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.Iterator; import java.util.List; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.TransferHandler; public class MainClass extends JFrame {
public MainClass() { super("Drop Target"); JComponent cp = (JComponent) getContentPane(); cp.setTransferHandler(new MyFileTransferHandler()); // see below setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(150, 150); } public static void main(String[] args) { new MainClass().setVisible(true); }
} class MyFileTransferHandler extends TransferHandler {
public boolean canImport(JComponent com, DataFlavor[] dataFlavors) { for (int i = 0; i < dataFlavors.length; i++) { DataFlavor flavor = dataFlavors[i]; if (flavor.equals(DataFlavor.javaFileListFlavor)) { System.out.println("canImport: JavaFileList FLAVOR: " + flavor); return true; } if (flavor.equals(DataFlavor.stringFlavor)) { System.out.println("canImport: String FLAVOR: " + flavor); return true; } System.err.println("canImport: Rejected Flavor: " + flavor); } return false; } public boolean importData(JComponent comp, Transferable t) { DataFlavor[] flavors = t.getTransferDataFlavors(); System.out.println("Trying to import:" + t); for (int i = 0; i < flavors.length; i++) { DataFlavor flavor = flavors[i]; try { if (flavor.equals(DataFlavor.javaFileListFlavor)) { System.out.println("importData: FileListFlavor"); List l = (List) t.getTransferData(DataFlavor.javaFileListFlavor); Iterator iter = l.iterator(); while (iter.hasNext()) { File file = (File) iter.next(); System.out.println("GOT FILE: " + file.getCanonicalPath()); } return true; } else if (flavor.equals(DataFlavor.stringFlavor)) { System.out.println("importData: String Flavor"); String fileOrURL = (String) t.getTransferData(flavor); System.out.println("GOT STRING: " + fileOrURL); try { URL url = new URL(fileOrURL); System.out.println("Valid URL: " + url.toString()); return true; } catch (MalformedURLException ex) { System.err.println("Not a valid URL"); return false; } } else { System.out.println("importData rejected: " + flavor); } } catch (IOException ex) { System.err.println("IOError getting data: " + ex); } catch (UnsupportedFlavorException e) { System.err.println("Unsupported Flavor: " + e); } } return false; }
}
</source>
Transferable: isDataFlavorSupported(DataFlavor flavor)
<source lang="java">
import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; public class Main {
public static void main(String args[]) { String toClipboard = "Hello from Java!"; StringSelection ss = new StringSelection(toClipboard); Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard(); clip.setContents(ss, ss); clip = Toolkit.getDefaultToolkit().getSystemClipboard(); Transferable contents = clip.getContents(new Main().getClass()); if (contents == null) { System.out.println("The clipboard is empty."); return; } if (contents.isDataFlavorSupported(DataFlavor.stringFlavor)) { try { String data = (String) contents.getTransferData(DataFlavor.stringFlavor); System.out.println(data); } catch (IOException ex) { System.out.println("IOException"); } catch (UnsupportedFlavorException ex) { System.out.println("UnsupportedFlavorException"); } } else{ System.out.println("Wrong flavor."); } }
}
</source>