Lancer des classes Java via Windows glisser-déposer

J’ai un fichier de classe java avec une méthode principale. Dans Windows, je voudrais pouvoir faire glisser des fichiers sur une icône de bureau / short / etc qui appellerait fournir les noms de fichiers à ma méthode principale. Fondamentalement, je veux autoriser les utilisateurs à glisser-déposer des fichiers lors de l’exécution du programme au lieu de les saisir sur la ligne de commande.

Des pensées?

Pour générer la réponse de daub815, sous Windows, vous pouvez utiliser un fichier de commandes pour transmettre des arguments à une autre commande. Dans ce cas, nous utiliserons le lanceur java pour lancer votre classe avec la méthode main .

J’ai effectué une recherche rapide sur Google sur la manière d’écrire un fichier de commandes pour prendre plusieurs arguments, et j’ai trouvé une page avec un fichier de commandes pour transmettre des arguments à une autre commande. En vous adaptant à l’exemple, voici ce que vous pouvez faire:

 @ECHO OFF :Loop IF "%1" == "" GOTO Done java YourClass %1 SHIFT GOTO Loop :Done 

Enregistrez le fichier ci-dessus en tant que fichier de commandes (avec une extension “.bat”), puis vous pouvez y glisser-déposer des fichiers, qui seront transmis en tant qu’arguments.

En outre, vous pouvez appeler le fichier de commandes à partir de la ligne de commande et transmettre des arguments également.

Edit : Il semble que le fichier de commandes ne fonctionnera pas avec des arguments entre guillemets contenant des espaces. L’utilisation d’une solution de contournement présentée dans le site auquel je suis lié divisera les espaces contenus dans le chemin d’access complet du fichier en arguments distincts, ce qui ne fonctionnera pas non plus. Si quelqu’un a une bonne idée de la manière de résoudre ce problème, veuillez modifier cette entrée ou poster une autre réponse. Je vais en faire un wiki communautaire.

OK, je l’ai fait fonctionner … La base de connaissances est d’utiliser DropHandler UUID dans le registre. J’ai fait un réglage de base, comme suit:

 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}" 

et … ça n’a pas marché!
J’ai juste oublié que java.exe veut un nom de classe, pas un nom de fichier! Mais je ne vois aucun moyen de le faire dans le registre.

Heureusement, il existe une solution de contournement, qui nécessite encore un fichier de script si nous voulons être génériques, pour travailler sur tous les fichiers de classe (avec la fonction principale statique, bien sûr!). Non lot, je les évite quand je peux. J’ai choisi d’utiliser WSH, car il devrait être disponible sur tous les systèmes Windows modernes. J’ai aussi choisi de faire un script JS, ça aurait pu être aussi un script VB.

J’ai donc fait le script suivant (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); 

J'ai laissé une sortie, pas utile dans ce contexte, mais utilisable pour le débogage (exécuté avec cscript).
Bien sûr, le chemin d'access à l'environnement JRE doit être ajusté.

Et j'ai changé la command dans le registre, comme suit:

 [HKEY_CLASSES_ROOT\JavaClass\shell\open\command] @="\wscript -b "D:\\_PhiLhoSoft\\WSH\\LaunchJavaClass.js\" %1 %*" 

Bien entendu, ajustez la trajectoire et conservez les autres lignes ci-dessus.

Maintenant, si je fais glisser des fichiers dans un fichier .class, il obtient les chemins de fichiers courts comme arguments de la fonction main ().

 import java.io.*; class TestDnD { public static void main(Ssortingng[] args) { Writer output = null; try { output = new BufferedWriter(new FileWriter(new File("LogFile.txt"))); for (Ssortingng arg : args) { output.write(arg + "\n"); } } catch (IOException ioe) { ioe.printStackTrace(); return; } finally { try { output.close(); } catch (IOException e) {} } } } 

Je pense que la première version du fichier .reg peut être utilisée pour autre chose, par exemple. glisser-déposer sur les fichiers .jar (en l’adaptant bien sûr).

Cette technique a un usage limité: nous faisons rarement des programmes en une classe en Java! Mais cela semblait être un défi intéressant et intéressant, alors je n'ai pas résisté à le résoudre. Remarque: vous pouvez append des éléments comme -Djava.ext.dirs="some path;another path" si vous avez besoin d'utiliser des bibliothèques externes (dans des fichiers jar).

La réponse de PhiLho fonctionne parfaitement si vous emballez les classes dans un fichier JAR exécutable (c’est comme ça que vous êtes censé le faire quand même) et créez un fichier .reg qui ressemble à celui ci-dessous. Ensuite, double-cliquez simplement sur ce fichier .reg pour le fusionner dans le registre et vous êtes prêt à partir. Cela vous permet à la fois de double-cliquer sur un fichier JAR pour l’exécuter et de le lancer par glisser-déposer.

N’oubliez pas de changer le chemin vers lequel votre exécutable Java est installé.

 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.jar] @="jarfile" [HKEY_CLASSES_ROOT\jarfile\DefaultIcon] @="C:\\Java\\jdk1.7.0\\bin\\java.exe,1" [HKEY_CLASSES_ROOT\jarfile\shell\open] @="Run Java Program" [HKEY_CLASSES_ROOT\jarfile\shell\open\command] @="\"C:\\Java\\jdk1.7.0\\bin\\java.exe\" -jar \"%1\" %*" [HKEY_CLASSES_ROOT\jarfile\shellex\DropHandler] @="{86C86720-42A0-1069-A2E8-08002B30309D}" 

Ajout sur Adiel A. Si vous créez un fichier batch, qui lance votre fenêtre Java en utilisant Swing. Vous voudriez que l’utilisateur dépose les fichiers sur cette fenêtre. Vous pourriez alors être capable de rooter ces fichiers supprimés.

Donc, il n’y a aucun moyen d’avoir Windows lui-même pour passer les arguments dans main () par glisser-déposer?