# Datei in Java öffnen...



## Jellysheep (16. Februar 2009)

Hi zusammen, 
geht das in Java, dass man Dateien nimmt und auf ein Frame/JFrame zieht und das Java Programm dann den Pfad weiß?
Ich wäre über eine Antwort sehr dankbar! 
VG
Jellysheep


----------



## zeja (16. Februar 2009)

Ja das geht:

```
package de.tutorials;

import java.awt.BorderLayout;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;

public class DropDemo extends JFrame {

	private DefaultListModel listModel;

	public DropDemo() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setTitle("DropDemo listing");
		setSize(300, 400);
		setLocationRelativeTo(null);

		initCenter( );
	}

	private void initCenter() {
		listModel = new DefaultListModel( );
		JList dropFileList = new JList(listModel);
		dropFileList.setDragEnabled(true);
		DropTarget dropTarget = new DropTarget(dropFileList,
				new FileDropTargetListener( ));
		add(dropFileList, BorderLayout.CENTER);
	}

	private class FileDropTargetListener extends DropTargetAdapter {

		@Override
		public void drop(DropTargetDropEvent evt) {
			final Transferable transferable = evt.getTransferable( );

			DataFlavor flavor = new DataFlavor(String.class,
					"text/uri-list; class=java.lang.String");
			if (transferable.isDataFlavorSupported(flavor)) {
				evt.acceptDrop(DnDConstants.ACTION_LINK);
				try {
					String transferData = (String) transferable
							.getTransferData(flavor);

					URL url = new URL(transferData);
					File file = new File(url.toURI( ));
					System.out.println(file.getAbsolutePath( ));

					listModel.addElement(file.getAbsolutePath( ));

					// Fertig
					evt.getDropTargetContext( ).dropComplete(true);
				}
				catch (UnsupportedFlavorException e) {
					e.printStackTrace( );
					evt.rejectDrop( );
				}
				catch (IOException e) {
					e.printStackTrace( );
					evt.rejectDrop( );
				}
				catch (URISyntaxException e) {
					e.printStackTrace( );
					evt.rejectDrop( );
				}
			}
			else {
				System.out.println("Flavor " + flavor + " not supported");
				evt.rejectDrop( );
			}

		}

	}

	public static void main(String[] args) {
		DropDemo wnd = new DropDemo( );
		wnd.setVisible(true);
	}
}
```

Das Beispiel nimmt eine Datei entgegen sofern diese als String übertragen werden kann und wandelt diesen String dann in ein File-Objekt um. Der Pfad wird einer JList hinzugefügt.


----------



## Jellysheep (17. Februar 2009)

Danke für die schnelle Antwort.... 
Kann ich jetzt auch eigene Dateitypen da eintragen?
Bis jetzt kann man ja nur Text ablegen... 
VG
Jellysheep


----------



## zeja (17. Februar 2009)

Du kriegst keinen Text sondern den Dateinamen. Das ist doch dass was du wolltest.


----------



## Jellysheep (17. Februar 2009)

ja, aber wenn ich dateien ablege, dann meldet er mir folgendes:

_Flavor java.awt.datatransfer.DataFlavor[mimetype=application/x-java-serialized-object;representationclass=java.lang.String] not supported
_

und keinen Pfad...


----------



## zeja (17. Februar 2009)

Dann lass dir mal evt.getCurrentDataFlavorsAsList ausgeben und schau mal was es noch für java.lang.String Flavors bei dir gibt. Das ist immer unterschiedlich wohl. Ich hab es auf Ubuntu Hardy mit dem Code unten getestet.


----------



## Jellysheep (17. Februar 2009)

Ich habs mal ausprobiert, bei mir kommt 
_[java.awt.datatransfer.DataFlavor[mimetype=application/x-java-file-list;representationclass=java.util.List]]
_
raus...
Was mache ich jetzt damit?
(Sorry, ich blick's noch nicht so ganz...)


----------



## zeja (17. Februar 2009)

Versuchs mal so:

```
package test;

import java.awt.BorderLayout;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;

public class DropDemo extends JFrame {

	private DefaultListModel listModel;

	public DropDemo() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setTitle("DropDemo listing");
		setSize(300, 400);
		setLocationRelativeTo(null);

		initCenter();
	}

	private void initCenter() {
		listModel = new DefaultListModel();
		JList dropFileList = new JList(listModel);
		dropFileList.setDragEnabled(true);
		DropTarget dropTarget = new DropTarget(dropFileList,
				new FileDropTargetListener());
		add(dropFileList, BorderLayout.CENTER);
	}

	private class FileDropTargetListener extends DropTargetAdapter {

		@Override
		public void drop(DropTargetDropEvent evt) {
			final Transferable transferable = evt.getTransferable();

			DataFlavor flavor = DataFlavor.javaFileListFlavor;
			if (transferable.isDataFlavorSupported(flavor)) {
				evt.acceptDrop(DnDConstants.ACTION_LINK);
				try {
					List<File> transferData = (List<File>) transferable
							.getTransferData(flavor);

					for (File file : transferData) {
						System.out.println(file.getAbsolutePath());
						listModel.addElement(file.getAbsolutePath());
					}

					// Fertig
					evt.getDropTargetContext().dropComplete(true);
				} catch (UnsupportedFlavorException e) {
					e.printStackTrace();
					evt.rejectDrop();
				} catch (IOException e) {
					e.printStackTrace();
					evt.rejectDrop();
				}
			} else {
				System.out.println("Flavor " + flavor + " not supported");
				evt.rejectDrop();
			}
		}
	}

	public static void main(String[] args) {
		DropDemo wnd = new DropDemo();
		wnd.setVisible(true);
	}
}
```

Ist nur offenbar dann Betriebssystemabhängig. Das läuft bei mir nun unter XP.


----------



## Jellysheep (17. Februar 2009)

Hey, cool... Funktioniert! 
Danke 
VG
Jellysheep


----------

