main メソッドを含む Java クラス ファイルがあります。Windows では、メイン メソッドにファイル名を提供するデスクトップ アイコン/ショート/etc にファイルをドラッグできるようにしたいと考えています。基本的に、ユーザーがコマンド ラインでファイルを入力する代わりに、プログラムの実行時にファイルをドラッグ アンド ドロップできるようにしたいと考えています。
何かご意見は?
main メソッドを含む Java クラス ファイルがあります。Windows では、メイン メソッドにファイル名を提供するデスクトップ アイコン/ショート/etc にファイルをドラッグできるようにしたいと考えています。基本的に、ユーザーがコマンド ラインでファイルを入力する代わりに、プログラムの実行時にファイルをドラッグ アンド ドロップできるようにしたいと考えています。
何かご意見は?
Windows で daub815 の回答に基づいて構築するには、バッチ ファイルを使用して引数を別のコマンドに渡すことができます。この場合、java
ランチャーを使用して、メソッドでクラスを起動しますmain
。
複数の引数を取るバッチ ファイルを作成する方法について Google で簡単に検索したところ、別のコマンドに引数を渡すバッチ ファイルを含むページが見つかりました。例から適応すると、次のことができます。
@ECHO OFF
:Loop
IF "%1" == "" GOTO Done
java YourClass %1
SHIFT
GOTO Loop
:Done
上記のファイルをバッチ ファイル (拡張子「.bat」) として保存すると、そのファイルにファイルをドラッグ アンド ドロップすると、引数として渡されます。
また、コマンド ラインからバッチ ファイルを呼び出して、引数を渡すこともできます。
編集: バッチ ファイルは、スペースを含む引用符で囲まれた引数では機能しないようです。私がリンクしたサイトに示されている回避策を使用すると、引用符で囲まれたファイルのフルパスに含まれるスペースが別々の引数に分割されるため、それも機能しません。これを修正する方法を誰かが知っている場合は、このエントリを編集するか、別の回答を投稿してください。これをコミュニティ wiki にします。
PhiLhoの答えは、実行可能なJARファイルにクラスをパックし(とにかくそれを行うための方法です)、次のような.regファイルを作成すると完全に機能します。次に、その.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}"
OK、うまくいきました... 基本的な知識は、レジストリで 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 システムで利用できるはずなので、WSH を使用することにしました。また、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 で 1 クラスのプログラムを作成することはめったにありません。しかし、それは良い、興味深い挑戦のように見えたので、私はそれを解決することに抵抗しませんでした. -Djava.ext.dirs="some path;another path"
注:外部ライブラリ(jarファイル)を使用する必要がある場合などに追加できます。
Adiel A に追加します。Swing を使用して Java ウィンドウを起動するバッチ ファイルを作成する場合。ユーザーにそのウィンドウにファイルをドロップしてもらいます。その後、ドロップされたファイルを介してルート化できる可能性があります。
では、ドラッグ アンド ドロップを介してウィンドウ自体に引数を main() に渡す方法はありませんか?