2008-12-20 17 views
5

Ich habe eine Java-Klasse-Datei mit einer Hauptmethode. In Windows würde ich gerne in der Lage sein, Dateien auf ein Desktop-Icon/short/etc zu ziehen, das die Dateinamen zu meiner Hauptmethode liefern würde. Grundsätzlich möchte ich Benutzern erlauben, Dateien bei der Programmausführung per Drag & Drop zu ziehen, anstatt sie in der Befehlszeile einzugeben.Starten von Java-Klassen über Windows Drag-and-Drop

Irgendwelche Gedanken?

+0

Entsprechendes für Mac OS X? Ich habe auch eine Datei, die ich in eine Java-Klasse ziehen möchte, um die gezogene Datei als Argument zur Verfügung zu stellen. – Eptin

Antwort

0

Hinzufügen auf Adiel A. Wenn Sie eine Batch-Datei erstellen, die Ihr Java-Fenster mit Swing startet. Sie würden den Benutzer die Dateien auf diesem Fenster ablegen lassen. Sie könnten dann in der Lage sein, diese abgelegten Dateien zu rooten.

+0

Ich habe meinen Beitrag gelöscht, um Dinge aufzuräumen. Das war ein Missverständnis, weil ich die Frage nicht gut gelesen habe. Ich Idiot. –

4

Um auf die Antwort von daub815 aufzubauen, können Sie in Windows eine Batchdatei verwenden, um Argumente an einen anderen Befehl zu übergeben. In diesem Fall verwenden wir den java Launcher zu Starten Sie Ihre Klasse mit der main Methode.

Ich habe eine schnelle Google-Suche nach dem Schreiben einer Batch-Datei, um mehrere Argumente, und found a page with a batch file to pass arguments zu einem anderen Befehl zu schreiben. Die Anpassung von das Beispiel, hier ist das, was Sie tun können:

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

Speichern Sie die obige Datei als Batchdatei (mit einer „.bat“ Erweiterung), und dann können Sie per Drag-and-Drop Dateien auf es, und es wird als Argumente übergeben werden.

Sie können die Batchdatei auch über die Befehlszeile aufrufen und Argumente übergeben.

Bearbeiten: Es scheint, dass die Batchdatei nicht mit in Anführungszeichen eingeschlossenen Argumenten funktioniert, die Leerzeichen enthalten. Wenn Sie eine Problemumgehung verwenden, die auf der Site angezeigt wird, mit der ich verlinkt habe, werden die im vollständigen Pfad der Datei enthaltenen Leerzeichen in separate Argumente aufgeteilt, sodass dies auch nicht funktioniert. Wenn jemand eine gute Idee hat, wie Sie das beheben können, bearbeiten Sie diesen Eintrag oder geben Sie eine andere Antwort ein. Ich werde dies zu einem Community-Wiki machen.

+0

Ich werde das versuchen, danke! –

+0

Sind Sie sicher, dass es nicht laufen würde. Ich denke, es wird laufen, aber mit ein paar Argumenten. Dann können wir alle Argumente in unserem Java-Programm zusammenführen/verketten. Was du sagst? –

0

Also gibt es keine Möglichkeit, dass Fenster selbst die Argumente in main() per Drag & Drop übergeben?

2

OK, ich habe es funktioniert ... Die Basiswissen ist DropHandler UUID in der Registrierung zu verwenden. Ich habe eine Grundeinstellung wie folgt gemacht:

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}" 

und ... es hat nicht funktioniert!
Ich habe gerade vergessen, dass java.exe einen Klassennamen, nicht einen Dateinamen will! Aber ich sehe keine Möglichkeit, das in der Registrierung zu tun.

Glücklicherweise gibt es eine Problemumgehung, die immer noch eine Skriptdatei benötigt, wenn wir generisch sein wollen, um an irgendwelchen/allen Klassendateien zu arbeiten (natürlich mit statischer Hauptfunktion!). Nicht stapelweise, ich vermeide sie, wenn ich kann. Ich entschied mich für WSH, da es auf jedem modernen Windows-System verfügbar sein sollte. Ich entschied mich auch, ein JS-Skript zu erstellen, es könnte auch ein VB-Skript sein.

Also machte ich das folgende Skript (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); 

ich einigen Ausgang links, in diesem Zusammenhang nicht sinnvoll, aber brauchbar für das Debuggen (läuft mit cscript).
Natürlich muss der Pfad zur JRE angepasst werden.

Und ich änderte die command in der Registrierung, wie folgt:

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

Natürlich Pfad anpassen, und halten Sie die oben anderen Linien.

Wenn ich jetzt einige Dateien in eine .class-Datei verschiebe, erhält es die kurzen Dateipfade als Argumente der main() -Funktion.

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) {} 
    } 
} 
} 

Ich denke, die erste Version der Reg-Datei kann für etwas anderes verwendet werden, z. Drag & Drop auf .jar Dateien (Anpassung natürlich).

Diese Technik hat eine begrenzte Verwendung: Wir machen selten Ein-Klassen-Programme in Java! Aber es sah nach einer guten und interessanten Herausforderung aus, also habe ich nicht widerstehen können, es zu lösen. Hinweis: Sie können Dinge wie -Djava.ext.dirs="some path;another path" hinzufügen, wenn Sie jemals externe Bibliotheken (in JAR-Dateien) benötigen.

2

PhiLhos Antwort funktioniert perfekt, wenn Sie die Klassen in eine ausführbare JAR-Datei packen (so soll es sowieso gemacht werden) und eine .reg-Datei erstellen, die wie die folgende aussieht. Dann doppelklicken Sie einfach auf diese .reg-Datei, um sie in die Registrierung einzubinden, und schon kann es losgehen. Auf diese Weise können Sie sowohl auf eine JAR-Datei doppelklicken, um sie auszuführen, als auch auf & Drop.

Denken Sie daran, den Pfad zu ändern, in dem Ihre Java-Programmdatei installiert ist.

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}" 
+0

Der Drophandler-Schlüssel war alles, was hinzugefügt werden musste, damit es perfekt funktionierte (die anderen existierten bereits). Ich war jedoch verwirrt über den seltsamen Schlüsselwert: {86C867 ...} Also habe ich etwas graben und dies ist der Windows-ID-Schlüssel für die .exe Zielprotokoll-Handler. Es ist im Wesentlichen eine Möglichkeit, das standardmäßige Drag'n'Drop-Verhalten von 'Argument übergeben' in den Befehl jarfile open einzufügen. Um zu überprüfen, ob die Nummer für dich die gleiche ist, öffne regedit und suche nach dem Wert ".exe drop target", es bringt dich zu einem Schlüssel mit dieser ID unter HKEY_LOCAL_MACHINE/SOFTWARE/Classes/ Fyi :) – Andrew

Verwandte Themen