通过windows拖放启动java类
我有一个带有main方法的java类文件。在Windows中,我希望能够将文件拖到桌面图标/short/etc上,该图标将调用并为我的main方法提供文件名。基本上,我希望允许用户在程序执行时拖放文件,而不是在命令行上键入文件通过windows拖放启动java类,java,windows,drag-and-drop,Java,Windows,Drag And Drop,我有一个带有main方法的java类文件。在Windows中,我希望能够将文件拖到桌面图标/short/etc上,该图标将调用并为我的main方法提供文件名。基本上,我希望允许用户在程序执行时拖放文件,而不是在命令行上键入文件 有什么想法吗?添加到Adiel A。如果您创建一个批处理文件,它将使用Swing启动Java窗口。您可以让用户将文件放到该窗口中。然后,您就可以从这些删除的文件中找到根目录 要基于daub815的答案,在Windows中,您可以使用批处理文件来传递 另一个命令的参数。在本
有什么想法吗?添加到Adiel A。如果您创建一个批处理文件,它将使用Swing启动Java窗口。您可以让用户将文件放到该窗口中。然后,您就可以从这些删除的文件中找到根目录 要基于daub815的答案,在Windows中,您可以使用批处理文件来传递 另一个命令的参数。在本例中,我们将使用
java
启动器
使用main
方法启动您的类
我在谷歌上快速搜索了如何编写一个批处理文件来获取多个参数,
和另一个命令。改编自
下面的示例是您可以执行的操作:
@ECHO OFF
:Loop
IF "%1" == "" GOTO Done
java YourClass %1
SHIFT
GOTO Loop
:Done
将上述文件另存为批处理文件(扩展名为“.bat”),然后可以拖放
文件,并将其作为参数传递
此外,还可以从命令行调用批处理文件并传递参数
编辑:批处理文件似乎无法处理包含空格的带引号的参数。使用我链接到的站点中提供的变通方法将文件引用的完整路径中包含的空格拆分为单独的参数,因此也不起作用。如果有人知道如何解决这个问题,请编辑这个条目,或者发布另一个答案。我将使其成为一个社区wiki。因此,无法让windows本身通过拖放将参数传递到main()中?好的,我让它工作了。。。基本知识是在注册表中使用DropHandler UUID。我做了一个基本设置,如下所示:
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}"
[HKEY_CLASSES_ROOT\JavaClass\shell\open\command]
@="\wscript -b "D:\\_PhiLhoSoft\\WSH\\LaunchJavaClass.js\" %1 %*"
而且。。。没用我只是忘了java.exe需要类名,而不是文件名!但我在登记处看不到这样做的方法 幸运的是,有一个变通方法,如果我们想成为泛型的话,仍然需要一个脚本文件来处理任何/所有类文件(当然是使用静态主函数!)。不是批量,我尽量避免。我选择使用WSH,因为它应该可以在任何现代Windows系统上使用。我还选择了制作一个JS脚本,它也可以是一个VB脚本 因此,我编写了以下脚本(LaunchJavaClass.js): 当然,调整路径,并保持上述其他行 现在,如果我将一些文件拖放到.class文件中,它将获得短文件路径作为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) {}
}
}
}
我认为.reg文件的第一个版本可以用于其他用途,例如在.jar文件上拖放(当然是修改)
这种技术的用途有限:我们很少用Java编写单类程序!但这看起来是一个很好很有趣的挑战,所以我没有拒绝去解决它。注意:如果您需要使用外部库(在jar文件中),您可以添加类似于
-Djava.ext.dirs=“some path;other path”
。如果您将类打包到可执行jar文件中(这就是您要做的),并创建一个类似于下面的.reg文件,PhiLho的答案将非常有效。然后双击该.reg文件,将其合并到注册表中,就可以开始了。这使您可以双击一个JAR文件来运行它,并通过拖放启动它
请记住更改安装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}"
你确定它不会跑吗。我想它会运行,但有一些争论。然后我们可以在Java程序中将所有参数合并/连接回一个参数。你说什么?我删除了我的帖子,来清理东西。那是一个误会,因为我没有把问题读清楚。愚蠢的我。drophandler密钥是所有需要添加的,以使其完美工作(其他的已经存在)。然而,我对奇怪的键值感到困惑:{86C867…}所以,我做了一些挖掘,这是.exe drop目标协议处理程序的windows id键。它本质上是一种将“参数传递”的默认拖放行为插入jarfile open命令的方法。要验证数字是否与您的相同,请打开regedit并搜索值“.exe drop target”,它应该会将您带到HKEY_LOCAL_MACHINE/SOFTWARE/Classes/Fyi:)下具有此ID的密钥。键值“{60254CA5-953B-11CF-8C96-00AA00B8708C}”更适合此操作—WSH drop处理程序可以更好地处理长文件名。(从这里获得:)Mac OS X有任何等价物吗?我也有一个文件要拖到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}"