OK, l'ho fatto funzionare ... La conoscenza di base è di usare l'UUID DropHandler nel registro. Ho fatto un'impostazione di base, come segue:
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}"
e ... non ha funzionato!
Ho appena dimenticato che java.exe vuole un nome di classe, non un nome di file! Ma non vedo modo di farlo nel registro.
Fortunatamente, c'è una soluzione alternativa, che necessita ancora di un file di script se vogliamo essere generici, per lavorare su qualsiasi/tutti i file di classe (con la funzione principale statica, ovviamente!). Non in gruppo, li evito quando posso. Ho scelto di usare WSH, come dovrebbe essere disponibile su qualsiasi sistema Windows moderno. Ho anche scelto di creare uno script JS, potrebbe anche essere uno script VB.
così ho fatto il seguente script (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);
ho lasciato un po 'di uscita, non è utile in questo contesto, ma utilizzabile per il debug (eseguito con cscript).
Naturalmente, il percorso per il JRE deve essere regolato.
E ho cambiato il command
nel Registro di sistema, come segue:
[HKEY_CLASSES_ROOT\JavaClass\shell\open\command]
@="\wscript -b "D:\\_PhiLhoSoft\\WSH\\LaunchJavaClass.js\" %1 %*"
Naturalmente, regolare percorso, e mantenere le suddette altre linee.
Ora, se trascino alcuni file in un file .class, ottiene i percorsi di file brevi come argomenti della funzione main().
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) {}
}
}
}
Penso che la prima versione del file .reg possa essere utilizzata per qualcos'altro, ad es. drag'n'drop su file .jar (adattandolo, ovviamente).
Questa tecnica ha un uso limitato: raramente realizziamo programmi di classe in Java! Ma sembrava una bella e interessante sfida, quindi non ho resistito per risolverlo. Nota: è possibile aggiungere elementi come -Djava.ext.dirs="some path;another path"
se è necessario utilizzare librerie esterne (in file jar).
Qualsiasi equivalente per Mac OS X? Anch'io ho un file che vorrei trascinare su una classe Java, al fine di fornire il file trascinato come argomento. – Eptin