soltar - en que consiste el jfc de java
Lanzar clases de Java a través de ventanas arrastrar y soltar (5)
Agregar a Adiel A. Si crea un archivo de proceso por lotes, que inicia su ventana de Java usando Swing. Haría que el usuario soltara los archivos en esa ventana. Entonces podría ser capaz de rootear esos archivos caídos.
Tengo un archivo de clase Java con un método principal. En Windows, me gustaría poder arrastrar archivos a un ícono de escritorio / abreviado / etc que me llamaría suministrar los nombres de archivo a mi método principal. Básicamente, quiero permitir a los usuarios arrastrar y soltar archivos en la ejecución del programa en lugar de escribirlos en la línea de comando.
¿Alguna idea?
Entonces, ¿no hay forma de que las ventanas pasen las args a main () arrastrando y soltando?
OK, lo hice funcionar ... El conocimiento básico es usar DropHandler UUID en el registro. Hice una configuración base, de la siguiente manera:
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}"
y ... ¡no funcionó!
¡Me olvidé de que java.exe quiere un nombre de clase, no un nombre de archivo! Pero no veo forma de hacer eso en el registro.
Afortunadamente, hay una solución alternativa, que aún necesita un archivo de script si queremos ser genéricos, para trabajar en cualquiera / todos los archivos de clase (¡con la función principal estática, por supuesto!). No por lotes, los evito cuando puedo. Elegí usar WSH, ya que debería estar disponible en cualquier sistema Windows moderno. También elegí hacer un script JS, podría haber sido un script VB también.
Así que hice el siguiente 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);
Dejé algunos resultados, no útiles en este contexto, pero utilizables para la depuración (ejecutar con cscript).
Por supuesto, el camino al JRE debe ser ajustado.
Y cambié el command
en el registro, como sigue:
[HKEY_CLASSES_ROOT/JavaClass/shell/open/command]
@="/wscript -b "D://_PhiLhoSoft//WSH//LaunchJavaClass.js/" %1 %*"
Por supuesto, ajuste la ruta y mantenga las otras líneas anteriores.
Ahora, si arrastro algunos archivos hacia un archivo .class, obtiene las rutas cortas de los archivos como argumentos de la función 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) {}
}
}
}
Creo que la primera versión del archivo .reg se puede utilizar para otra cosa, por ejemplo. arrastrar y soltar los archivos .jar (adaptándolo, por supuesto).
Esta técnica tiene un uso limitado: ¡raramente hacemos programas de una clase en Java! Pero parecía un desafío bueno e interesante, así que no me resistí a resolverlo. Nota: puede agregar cosas como -Djava.ext.dirs="some path;another path"
si alguna vez necesita usar bibliotecas externas (en archivos jar).
Para construir sobre la respuesta de daub815, en Windows, puede usar un archivo por lotes para pasar argumentos a otro comando. En este caso, usaremos el java
para iniciar su clase con el método main
.
Hice una búsqueda rápida en Google sobre cómo escribir un archivo por lotes para tomar múltiples argumentos, y encontré una página con un archivo por lotes para pasar argumentos a otro comando. Adaptándonos del ejemplo, esto es lo que puedes hacer:
@ECHO OFF
:Loop
IF "%1" == "" GOTO Done
java YourClass %1
SHIFT
GOTO Loop
:Done
Guarde el archivo anterior como un archivo por lotes (con una extensión ".bat"), y luego puede arrastrar y soltar archivos en él, y se pasará como argumentos.
Además, puede llamar al archivo por lotes desde la línea de comando y pasar los argumentos también.
Editar : parece que el archivo por lotes no funcionará con los argumentos entre comillas que contienen espacios. Usar una solución alternativa presentada en el sitio al que me he vinculado dividirá los espacios contenidos en la ruta completa entre comillas del archivo en argumentos separados, por lo que tampoco funcionará. Si alguien tiene una buena idea de cómo solucionar esto, edite esta entrada o publique otra respuesta. Haré de esto una wiki comunitaria.
La respuesta de PhiLho funciona perfectamente si empaca las clases en un archivo JAR ejecutable (así es como debe hacerlo de todos modos) y crea un archivo .reg similar al siguiente. Luego haga doble clic en ese archivo .reg para fusionarlo en el registro y listo. Esto le permite hacer doble clic en un archivo JAR para ejecutarlo e iniciarlo arrastrando y soltando.
Recuerde cambiar la ruta a donde está instalado su ejecutable Java.
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}"