2008-12-20 9 views
5

Ho un file di classe java con un metodo principale. In Windows, mi piacerebbe essere in grado di trascinare i file su un'icona del desktop/breve/etc che chiamerebbe fornire i nomi dei file al mio metodo principale. Fondamentalmente, voglio consentire agli utenti di trascinare e rilasciare i file all'esecuzione del programma invece di doverli digitare sulla riga di comando.Avvio di classi java tramite il drag-and-drop di windows

Qualche idea?

+0

Qualsiasi equivalente per Mac OS X? Anch'io ho un file che vorrei trascinare su una classe Java, al fine di fornire il file trascinato come argomento. – Eptin

risposta

0

Aggiunta su Adiel A. Se si crea un file batch, che avvia la finestra Java utilizzando Swing. L'utente dovrebbe rilasciare i file su quella finestra. Potresti quindi essere in grado di eseguire il root attraverso quei file rilasciati.

+0

Ho cancellato il mio post, per ripulire le cose. È stato un equivoco perché non ho letto bene la domanda. Che stupido. –

4

Per costruire sulla risposta di daub815, in Windows, è possibile utilizzare un file batch per passare gli argomenti a un altro comando. In questo caso, verrà utilizzato il launcher java su per avviare la classe con il metodo main.

Ho fatto una rapida ricerca su Google su come scrivere un file batch per accettare più argomenti, e found a page with a batch file to pass arguments in un altro comando. Adattamento dal l'esempio, ecco cosa si può fare:

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

Salvare il file di cui sopra come un file batch (con estensione ".bat"), e quindi è possibile trascinare e rilasciare i file su esso e sarà passato come argomenti.

Inoltre, è possibile chiamare il file batch dalla riga di comando e passare anche gli argomenti.

Modifica: Sembra che il file batch non funzioni con argomenti citati che contengono spazi. L'utilizzo di una soluzione alternativa presentata nel sito a cui mi sono collegato dividerà gli spazi contenuti nel percorso completo quotato del file in argomenti separati, quindi non funzionerà neanche. Se qualcuno ha una buona idea su come risolvere il problema, modifica questa voce o pubblica un'altra risposta. Renderò questo un wiki della comunità.

+0

Ci proverò, grazie! –

+0

Sei sicuro che non funzionerebbe. Immagino che funzionerà, ma con alcuni argomenti. Quindi possiamo unire/concatenare tutti gli argomenti a uno nel nostro programma Java. Cosa dici? –

0

Quindi non c'è modo di avere Windows stesso passare gli argomenti in main() tramite trascinamento della selezione?

2

OK, l'ho fatto funzionare ... La conoscenza di base è di usare l'UUID DropHandler nel registro. Ho fatto un'impostazione di base, come segue:

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

e ... non ha funzionato!
Ho appena dimenticato che java.exe vuole un nome di classe, non un nome di file! Ma non vedo modo di farlo nel registro.

Fortunatamente, c'è una soluzione alternativa, che necessita ancora di un file di script se vogliamo essere generici, per lavorare su qualsiasi/tutti i file di classe (con la funzione principale statica, ovviamente!). Non in gruppo, li evito quando posso. Ho scelto di usare WSH, come dovrebbe essere disponibile su qualsiasi sistema Windows moderno. Ho anche scelto di creare uno script JS, potrebbe anche essere uno script VB.

così ho fatto il seguente script (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); 

ho lasciato un po 'di uscita, non è utile in questo contesto, ma utilizzabile per il debug (eseguito con cscript).
Naturalmente, il percorso per il JRE deve essere regolato.

E ho cambiato il command nel Registro di sistema, come segue:

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

Naturalmente, regolare percorso, e mantenere le suddette altre linee.

Ora, se trascino alcuni file in un file .class, ottiene i percorsi di file brevi come argomenti della funzione 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) {} 
    } 
} 
} 

Penso che la prima versione del file .reg possa essere utilizzata per qualcos'altro, ad es. drag'n'drop su file .jar (adattandolo, ovviamente).

Questa tecnica ha un uso limitato: raramente realizziamo programmi di classe in Java! Ma sembrava una bella e interessante sfida, quindi non ho resistito per risolverlo. Nota: è possibile aggiungere elementi come -Djava.ext.dirs="some path;another path" se è necessario utilizzare librerie esterne (in file jar).

2

La risposta di PhiLho funziona perfettamente se si impacchettano le classi in un file JAR eseguibile (è come si intende farlo in ogni caso) e si crea un file .reg simile a quello seguente. Quindi fai doppio clic sul file .reg per unirlo nel registro e sei pronto per andare. Ciò consente sia di fare doppio clic su un file JAR per eseguirlo, sia avviandolo trascinando lo spostamento &.

Ricordarsi di modificare il percorso in cui è installato il file eseguibile 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}" 
+0

Il codice del drophandler era tutto ciò che era necessario aggiungere per farlo funzionare perfettamente (gli altri esistevano già). Sono stato comunque confuso dal valore della chiave strana: {86C867 ...} Quindi, ho fatto qualche ricerca e questa è la chiave di id di Windows per il gestore di protocollo di destinazione drop .exe. È essenzialmente un modo di collegare il comportamento di drag'n'drop predefinito di "argomento che passa" nel comando open jarfile. Per verificare che il numero sia lo stesso per te, apri regedit e fai una ricerca per il valore "destinazione drop exe", dovrebbe portarti a una chiave con questo ID sotto HKEY_LOCAL_MACHINE/SOFTWARE/Classes/ Fyi :) – Andrew