【问题标题】:Launching java classes via windows drag-and-drop通过 Windows 拖放启动 java 类
【发布时间】:2010-09-27 19:51:26
【问题描述】:

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

有什么想法吗?

【问题讨论】:

  • Mac OS X 的任何等价物?我也有一个文件我想拖到 Java 类上,以便将拖曳的文件作为参数提供。

标签: java windows drag-and-drop


【解决方案1】:

要建立在 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”),然后就可以拖放了 文件到它上面,它将作为参数传递。

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

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

【讨论】:

  • 你确定它不会运行吗?我想它会运行,但有一些参数。然后我们可以在我们的 Java 程序中将所有参数合并/连接回一个。你说什么?
【解决方案2】:

如果您将类打包在一个可执行的 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}" 

【讨论】:

  • 只需要添加 drophandler 键即可使其完美运行(其他键已经存在)。然而,我对奇怪的键值感到困惑:{86C867...} 所以,我做了一些挖掘,这是 .exe 放置目标协议处理程序的 windows id 键。它本质上是将“参数传递”的默认拖放行为插入到 jarfile 打开命令中的一种方式。要验证您的数字是否相同,请打开 regedit 并搜索值“.exe drop target”,它应该会将您带到 HKEY_LOCAL_MACHINE/SOFTWARE/Classes/ Fyi 下具有此 ID 的密钥 :)
  • 键值“{60254CA5-953B-11CF-8C96-00AA00B8708C}”对此更好 - 它是更好地处理长文件名的 WSH 删除处理程序。 (从这里获得:stackoverflow.com/a/142854/638544
【解决方案3】:

好的,我成功了……基础知识是在注册表中使用 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 想要一个类名,而不是文件名!但我认为在注册表中没有办法做到这一点。

幸运的是,有一个解决方法,如果我们想要通用,仍然需要一个脚本文件来处理任何/所有类文件(当然,使用静态 main 函数!)。不是批次,我尽可能避免它们。我选择使用 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" 之类的内容。

【讨论】:

    【解决方案4】:

    添加到 Adiel A. 如果您创建一个批处理文件,它使用 Swing 启动您的 Java 窗口。您将让用户将文件拖放到该窗口上。然后,您就可以通过这些删除的文件进行 root。

    【讨论】:

    • 我删除了我的帖子,以清理东西。这是一个误解,因为我没有很好地阅读这个问题。愚蠢的我。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多