Datei in Java öffnen...

Jellysheep

Erfahrenes Mitglied
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! :D
VG
Jellysheep
 
Ja das geht:
Java:
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.
 
Danke für die schnelle Antwort.... :)
Kann ich jetzt auch eigene Dateitypen da eintragen?
Bis jetzt kann man ja nur Text ablegen... :confused:
VG
Jellysheep
 
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... :confused:
 
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.
 
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...)
 
Versuchs mal so:
Java:
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.
 

Neue Beiträge

Zurück