通过windows拖放启动java类

时间:2008-12-20 03:55:05

标签: java windows drag-and-drop

我有一个带有main方法的java类文件。在Windows中,我希望能够将文件拖到桌面图标/短/等上,这将调用提供给我的main方法的文件名。基本上,我希望允许用户在程序执行时拖放文件,而不是在命令行上键入它们。

有什么想法吗?

5 个答案:

答案 0 :(得分:4)

要在daub815的答案上构建,在Windows中,您可以使用批处理文件来传递 另一个命令的参数。在这种情况下,我们将使用java启动器 使用main方法启动课程。

我快速搜索了如何编写批处理文件以获取多个参数的Google搜索, 和found a page with a batch file to pass arguments到另一个命令。适应 例子,这是你可以做的:

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

将上述文件保存为批处理文件(扩展名为“.bat”),然后您可以拖放 文件放在它上面,它将作为参数传递。

此外,您可以从命令行调用批处理文件并传递参数。

编辑:批处理文件似乎不适用于包含空格的带引号的参数。使用我链接到的站点中提供的解决方法将文件的引用完整路径中包含的空格拆分为单独的参数,因此也不起作用。如果有人知道如何解决这个问题,请编辑此条目,或发布另一个答案。我将把它变成一个社区维基。

答案 1 :(得分:3)

如果您将类打包在一个可执行的JAR文件中(无论如何都是这样做的话),PhiLho的答案都可以正常工作,并创建一个类似下面的.reg文件。然后双击该.reg文件将其合并到注册表中,你就可以了。这使您可以双击JAR文件来运行它,并通过Drag& amp;下降。

请记住更改安装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}" 

答案 2 :(得分:2)

好的,我让它工作了...基础知识是在注册表中使用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}"

并且......它不起作用!
我只是忘了java.exe想要一个类名,而不是文件名!但我认为在注册表中无法做到这一点。

幸运的是,有一种解决方法,如果我们想要通用,仍然需要一个脚本文件来处理任何/所有类文件(当然还有静态主函数!)。不批量,我尽可能避免它们。我选择使用WSH,因为它应该适用于任何现代Windows系统。我也选择制作一个JS脚本,它也可以是一个VB脚本。

所以我制作了以下脚本(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);

我留下了一些输出,在此上下文中没用,但可用于调试(使用cscript运行) 当然,必须调整JRE的路径。

我更改了注册表中的command,如下所示:

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

当然,调整路径,并保留上述其他行。

现在,如果我将一些文件拖放到.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;another path"之类的东西。

答案 3 :(得分:0)

添加到Adiel A.如果您创建批处理文件,则使用Swing启动Java窗口。您可以让用户将文件放到该窗口中。然后,您可以根据这些删除的文件进行根。

答案 4 :(得分:0)

所以没有办法让windows本身通过拖放将args传递给main()?