OK, ich habe es funktioniert ... Die Basiswissen ist DropHandler UUID in der Registrierung zu verwenden. Ich habe eine Grundeinstellung wie folgt gemacht:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.class]
@="JavaClass"
[HKEY_CLASSES_ROOT\JavaClass\DefaultIcon]
@="C:\\Java\\jdk1.6.0_05\\bin\\java.exe,1"
[HKEY_CLASSES_ROOT\JavaClass\shell\open]
@="Run Java class"
[HKEY_CLASSES_ROOT\JavaClass\shell\open\command]
@="\"C:\\Java\\jdk1.6.0_05\\bin\\java.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\JavaClass\shellex\DropHandler]
@="{86C86720-42A0-1069-A2E8-08002B30309D}"
und ... es hat nicht funktioniert!
Ich habe gerade vergessen, dass java.exe einen Klassennamen, nicht einen Dateinamen will! Aber ich sehe keine Möglichkeit, das in der Registrierung zu tun.
Glücklicherweise gibt es eine Problemumgehung, die immer noch eine Skriptdatei benötigt, wenn wir generisch sein wollen, um an irgendwelchen/allen Klassendateien zu arbeiten (natürlich mit statischer Hauptfunktion!). Nicht stapelweise, ich vermeide sie, wenn ich kann. Ich entschied mich für WSH, da es auf jedem modernen Windows-System verfügbar sein sollte. Ich entschied mich auch, ein JS-Skript zu erstellen, es könnte auch ein VB-Skript sein.
Also machte ich das folgende Skript (LaunchJavaClass.js):
if (WScript.Arguments.count() == 0)
{
WScript.StdOut.Write("No parameters");
WScript.Quit(1);
}
var className = WScript.Arguments.Item(0);
//~ WScript.StdOut.Write(className + "\n");
var m = className.match(/^(.*)\\(.+?)\.class$/);
if (m == null)
{
WScript.StdOut.Write("Not a class file");
WScript.Quit(1);
}
var classPath = m[1];
className = m[2];
//~ WScript.StdOut.Write(classPath + " >>> " + className + "\n");
var params = new Array();
for (i = 1; i < WScript.Arguments.count(); i++)
{
params[params.length] = WScript.Arguments.Item(i);
}
var cmd = "cmd /c cd /D " + classPath +
" & C:/Java/jdk1.6.0_05/bin/java.exe " +
className + " " + params.join(" ");
//~ WScript.StdOut.Write(cmd + "\n");
var shell = WScript.CreateObject("WScript.Shell");
//~ var exec = shell.Exec(cmd); // Can be used to get stdout
shell.Run(cmd, 0);
ich einigen Ausgang links, in diesem Zusammenhang nicht sinnvoll, aber brauchbar für das Debuggen (läuft mit cscript).
Natürlich muss der Pfad zur JRE angepasst werden.
Und ich änderte die command
in der Registrierung, wie folgt:
[HKEY_CLASSES_ROOT\JavaClass\shell\open\command]
@="\wscript -b "D:\\_PhiLhoSoft\\WSH\\LaunchJavaClass.js\" %1 %*"
Natürlich Pfad anpassen, und halten Sie die oben anderen Linien.
Wenn ich jetzt einige Dateien in eine .class-Datei verschiebe, erhält es die kurzen Dateipfade als Argumente der main() -Funktion.
import java.io.*;
class TestDnD
{
public static void main(String[] args)
{
Writer output = null;
try
{
output = new BufferedWriter(new FileWriter(new File("LogFile.txt")));
for (String arg : args)
{
output.write(arg + "\n");
}
}
catch (IOException ioe)
{
ioe.printStackTrace();
return;
}
finally
{
try { output.close(); } catch (IOException e) {}
}
}
}
Ich denke, die erste Version der Reg-Datei kann für etwas anderes verwendet werden, z. Drag & Drop auf .jar Dateien (Anpassung natürlich).
Diese Technik hat eine begrenzte Verwendung: Wir machen selten Ein-Klassen-Programme in Java! Aber es sah nach einer guten und interessanten Herausforderung aus, also habe ich nicht widerstehen können, es zu lösen. Hinweis: Sie können Dinge wie -Djava.ext.dirs="some path;another path"
hinzufügen, wenn Sie jemals externe Bibliotheken (in JAR-Dateien) benötigen.
Entsprechendes für Mac OS X? Ich habe auch eine Datei, die ich in eine Java-Klasse ziehen möchte, um die gezogene Datei als Argument zur Verfügung zu stellen. – Eptin